Domanda

Sto disegnando un disco piatto usando gluDisk() nella mia scena gluDisk() disegna il disco rivolto verso l'asse Z positivo ma voglio che sia rivolto verso una normale arbitraria che ho.
Chiaramente devo usare glRotate() per far sì che il disco sia rivolto correttamente ma quale dovrebbe essere la rotazione?Ricordo che questo può essere calcolato usando i quaternioni ma non riesco a ricordare i calcoli.

È stato utile?

Soluzione

La soluzione dovrebbe essere abbastanza semplice, e non richiede quarternions.

L'asse di rotazione per andare da normale1 a Normale 2 deve essere ortogonale ad entrambi, quindi basta prendere il loro prodotto incrociato vector .

La quantità di rotazione è facilmente deducibile dal loro dot-prodotto . Questo valore è | A |. | B |. .Cos (theta), ma come i due vettori normali devono essere normalizzati darà cos (theta), quindi basta prendere il coseno inverso per ottenere la quantità di rotazione

Il vettore risultante e l'angolo sono i parametri richiesti per glRotate() - non c'è bisogno di calcolare la matrice reale di rotazione da soli.

P.S. non dimenticate che glRotate() ha bisogno l'angolo in gradi, ma le normali funzioni trigonometriche C funziona in radianti.

Altri suggerimenti

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

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. Otterrete il vettore ortogonale (che sarà il vostro vettore di rotazione per creare il quaternione) e la lunghezza di questo vettore è il peccato dell'angolo devi compensare in modo che la sovrapposizione di inizio e di destinazione di vettore.

I quaternioni descrivono una rotazione attorno ad un asse. <w,x,y,z> ruoterà attorno all'asse <x,y,z> una certa quantità a seconda dell'equilibrio tra la grandezza 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 invece verso l'asse Y positivo, sarà necessario ruotarlo di 90° attorno 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 dall'essere rivolta verso l'asse Z positivo all'essere rivolta verso il vettore <x,y,z> devi 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 fosse rivolto verso l'asse Z positivo, il vettore corrente sarebbe <0, 0, 1>.Se vuoi affrontarlo <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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top