Spesso è il caso che si desidera modificare una matrice da un insieme di avanti/destra/su convenzioni a un'altra serie di avanti/destra/su convenzioni. Ad esempio, ROS usa z-up, e Unreal usa y-up. Il processo funziona indipendentemente dal fatto che sia necessario o meno fare un lancio.
Si noti che la frase "passare da destrorso a mancino" è ambigua. Ci sono molte convenzioni di sinistra/destra/su mancino. Ad esempio: forward = z, right = x, up = y; e avanti = x, destra = y, su = z. Dovresti davvero pensare a "come converto la nozione di ROS di forward/right/up alla nozione di Unreal di forward/right/up".
Quindi, è un lavoro semplice creare una matrice che converta tra convenzioni. Supponiamo che abbiamo fatto e ora abbiamo
mat4x4 unrealFromRos = /* construct this by hand */;
mat4x4 rosFromUnreal = unrealFromRos.inverse();
Diciamo che l'OP ha una matrice che viene da ROS, e vuole usarlo in Unreal. La sua matrice originale prende un vettore in stile ROS, fa alcune cose e emette un vettore in stile ROS. Ha bisogno di una matrice che prende un vettore in stile Unreal, fa le stesse cose ed emette un vettore stile Unreal. Sembra:
mat4x4 turnLeft10Degrees_ROS = ...;
mat4x4 turnLeft10Degrees_Unreal = unrealFromRos * turnLeft10Degrees_ROS * rosFromUnreal;
Dovrebbe essere abbastanza chiaro il motivo per cui funziona. Prendi un vettore Unreal, lo converti in stile ROS, e ora puoi usare la matrice in stile ROS su di esso. Questo ti dà un vettore ROS, che converti in stile Unreal.
risposta di Gerrit non è abbastanza completamente generale, perché nel caso generale, rosFromUnreal! = UnrealFromRos. È vero se stai invertendo un solo asse, ma non è vero se stai facendo qualcosa come convertire X-> Y, Y-> Z, Z-> X. Ho scoperto che è meno incline agli errori usare sempre una matrice e il suo contrario per fare queste convenzioni, piuttosto che provare a scrivere funzioni speciali che capovolgono solo i membri giusti.
Questo tipo di funzionamento della matrice inverse(M) * X * M
arriva un sacco. Si può pensare ad un'operazione di "cambio di base"; per saperne di più, vedi https://en.wikipedia.org/wiki/Matrix_similarity.
I può essere confuso qui, perché non si può semplicemente scambiare i valori Y e Z? Suppongo tu intenda una matrice 4x4x4, dal momento che un 4x4 non avrebbe z. – derobert
Solo una matrice 4x4. Basta ruotando i valori di traslazione yez non sembra funzionare e una matrice contiene anche un'operazione di rotazione così sto asuming il problema è lì. – cmann
Penso che avrai bisogno di chiarire esattamente quello che vuoi prima che qualcuno possa rispondere alla tua domanda. Per un vettore '(x, y, z, w)', hai spiegato che per "passare da destrorso a mancino" significa che lo si cambia nel vettore '(x, z, y, w) ', ma non è del tutto chiaro cosa significhi questa frase per una matrice. Ad esempio, supponiamo che una matrice prenda il vettore '(1,2,3,4)' al vettore '(5,6,7,8)', quindi quando si "passa da destrorso a mancino", dovrebbe prendere '(1,2,3,4)' a '(5,7,6,8)', o dovrebbe prendere '(1,3,2,4)' a '(5,7,6 , 8) ', o intendevi che facesse qualcos'altro? –