Risposte:
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.
X
trova -Y
.