Come calcolare una matrice di rotazione 3x3 da 2 vettori di direzione?


10

Ho 2 vettori di direzione, per l'asse X e l'asse Y dell'oggetto. Come calcolo la matrice di rotazione dell'oggetto usando questi?

Risposte:


17

L'idea di base è quella di utilizzare un prodotto incrociato per generare gli assi ortogonali extra della matrice di rotazione, in base agli assi che già possiedi.

Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )  
{  
    // make sure that we actually have two unique vectors.
    assert( X != Y );

    Matrix3x3 M;  
    M.X = normalise( X );  
    M.Z = normalise( cross_product(X,Y) );
    M.Y = normalise( cross_product(M.Z,X) );  
    return M;
}

Nota che quanto sopra non fa ipotesi sui vettori X e Y (a parte il fatto che non sono identici) e fa molta matematica extra che potrebbe non avere a che fare con la tua situazione.

Ad esempio, in questo codice sto facendo un secondo prodotto incrociato per essere sicuro che la nostra matrice ottenga un asse Y ortogonale, invece di confidare ciecamente che gli assi X e Y di input siano esattamente a 90 gradi di distanza. Se nella tua situazione sei sicuro che i tuoi assi di input siano realmente ortogonali tra loro, puoi saltare il secondo prodotto incrociato e assegnare direttamente il vettore di input Y, invece di ricalcolarlo.

Nota che suppongo che la tua rappresentazione matriciale abbia membri vettoriali "X, Y, Z" accessibili. Alcune implementazioni espongono invece una matrice di nove float, nel qual caso il vettore 'X' sarà o elementi 0, 1 e 2 o 0, 3 e 6, a seconda che la matrice sia riga-maggiore o colonna- maggiore. In questa (fastidiosa) situazione, di solito trovo che sia più semplice provare entrambi i modi e vedere quale funziona, piuttosto che cercare nella documentazione per cercare di capire quale ordine sta utilizzando l'implementazione della tua matrice particolare. :)

Infine, nota che, a seconda della mano del tuo sistema di coordinate 3D, potresti dover moltiplicare MZ per uno negativo, al fine di generare una matrice di rotazione legale per il tuo motore 3D.


Grazie mille! Lo farò e ti farò sapere i miei risultati.
TheFlash,

Grazie per la risposta molto utile! Sono curioso, però: il vettore X non è sempre gli elementi 0, 1 e 2 indipendentemente dal fatto che la matrice sia riga o colonna maggiore? 0, 3 e 6 implicherebbero l'accesso alla prima colonna di una matrice maggiore di riga o viceversa.
febbraio

1
+1 per almeno asserire () che i due vettori non sono uguali, ma penso che dovresti anche richiedere che non siano zero vettori.
hans_meine,

1
Si noti che questo non tiene conto di un caso in cui si Xtrova -Y.
Rafał Cieślak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.