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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top