2009-04-18 18 views
8

Sto disegnando un disco piatto usando gluDisk() nella mia scena. gluDisk() disegna il disco rivolto verso l'asse Z positivo ma voglio che sia di fronte ad un normale arbitrario che ho.
Chiaramente ho bisogno di utilizzare glRotate() per ottenere il disco rivolto in modo corretto, ma quale dovrebbe essere la rotazione? Ricordo che questo può essere calcolato usando i Quaternioni ma non riesco a ricordare la matematica.Quaternion matematica per rotazione?

risposta

16

La soluzione dovrebbe essere piuttosto semplice e non richiedere le istruzioni.

L'asse di rotazione per passare da Normale1 a Normale2 deve essere ortogonale a entrambi, quindi è sufficiente prendere il loro prodotto vettore incrociato.

La quantità di rotazione è facilmente derivata dal loro prodotto dot. Questo valore è | A |. | B | .cos (theta), ma poiché i due vettori normali dovrebbero essere normalizzati, fornirà cos (theta), quindi basta prendere il coseno inverso per ottenere la quantità di rotazione.

Il vettore e l'angolo risultanti sono i parametri richiesti per glRotate() - non è necessario calcolare autonomamente la matrice di rotazione effettiva.

p.s. non dimenticare che glRotate() ha bisogno dell'angolo in gradi, ma le normali funzioni trigonometriche funzionano in radianti.

+0

Grazie. quello ha funzionato perfettamente. – shoosh

3

I quaternioni descrivono una rotazione attorno a un asse. <w,x,y,z> ruoterà attorno all'asse <x,y,z> in base al saldo tra la magnitudine di w e la grandezza del vettore.

<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1 

Ad esempio, ruotandolo per affrontare l'asse Y positivo invece, è necessario ruotarlo di 90 ° intorno all'asse X. Il vettore sarebbe <0, 1, 0> e il quaternione sarebbe <cos 90°, 0, sin 90°, 0> = <0, 0, 1, 0>.

Per ruotare la figura da fronte dell'asse Z positivo, verso il vettore <x,y,z> è necessario trovare il vettore di rotazione e l'angolo di rotazione. Per trovare l'asse di rotazione, puoi prendere il prodotto incrociato di un vettore corrente e dove vuoi che sia.

Se è rivolto verso l'asse Z positivo, il vettore corrente sarà <0, 0, 1>. Se si desidera che faccia fronte <x,y,z>, l'asse di rotazione sarebbe <0, 0, 1> x <x, y, z> = <-y, x, 0> e l'angolo sarebbe arctan(sqrt(x^2+y^2),z). Il quaternione diventa

<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z) 
6

rotazione attorno ad un asse arbitrario: dato angolo r in radianti e versore u = Ai + bj + ck o [a, b, c], definiscono:

q0 = cos(r/2) 
q1 = sin(r/2) a 
q2 = sin(r/2) b 
q3 = sin(r/2) c 

e costruire da questi valori la matrice di rotazione:

(q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3)   | 2*(q1*q3 + q0*q2)  ) 
Q =(2*(q2*q1 + q0*q3)  | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1)  ) 
    (2*(q3*q1 - q0*q2)  | 2*(q3*q2 + q0*q1)   | q0^2 - q1^2 - q2^2 + q3^2) 

per trovare la rotazione che devi fare, è possibile calcolare il prodotto vettoriale tra il vettore e il vettore corrente di destinazione. Otterrai il vettore ortogonale (che sarà il tuo vettore di rotazione per creare il quaternione) e la lunghezza di questo vettore è il peccato dell'angolo che devi compensare in modo che il vettore iniziale e di destinazione si sovrappongano.

Problemi correlati