Qual è il modo più semplice per allineare l'asse Z con un vettore?
Domanda
Dato un punto come (0, 0, 0) e un vettore come (x, y, z). Qual è il modo più semplice per allineare l'asse Z negativo centrato su (0, 0, 0) per puntare nella direzione di questo vettore? Gli esempi che utilizzano OpenGL sarebbero i benvenuti, ma non necessari.
Soluzione
Esistono molti modi diversi per ruotare una cornice di coordinate per puntare in una data direzione; lasceranno tutti l'asse z puntato nella direzione desiderata, ma con variazioni nel modo in cui gli assi x e y sono orientati.
Di seguito viene fornita la rotazione più breve, che può essere o meno quella desiderata.
vec3 target_dir = normalise( vector );
float rot_angle = acos( dot_product(target_dir,z_axis) );
if( fabs(rot_angle) > a_very_small_number )
{
vec3 rot_axis = normalise( cross_product(target_dir,z_axis) );
glRotatef( rot_angle, rot_axis.x, rot_axis.y, rot_axis.z );
}
Altri suggerimenti
Probabilmente vuoi dare un'occhiata a l'articolo di Diana Gruber
Per rispondere alla mia domanda, la migliore risposta che ho trovato è questa:
Dividi il vettore in "componenti". Il componente x è lo spostamento lungo l'asse x. Se passiamo alla trigonometria, abbiamo quel cos (alfa) = x / vector_magnitude. Se calcoliamo l'RHS, allora possiamo derivare l'alfa, che è la quantità di cui dovremmo ruotare attorno all'asse y.
Quindi il sistema di coordinate può essere allineato al vettore mediante una serie di chiamate a glRotatef ()
Esistono molte risorse sulla rotazione delle coordinate (o sulla rotazione di oggetti, che equivale alla stessa cosa). Ho imparato molto da questo sito , entrambi su come programmare in dimensioni multiple e in particolare come manipolare i vettori
La pagina qui ha una sezione " Trasformazioni per spostare un vettore sull'asse z " quello sembra essere quello che vuoi, o forse il contrario.