Convertire la rotazione del Quaternion in matrice di rotazione?

Fondamentalmente, dato un quaterio (qx, qy, qz, qw) … Come posso convertirlo in una matrice di rotazione OpenGL? Sono anche interessato a quale riga di matrice è “Su”, “Destra”, “Avanti” ecc … Ho una rotazione della telecamera in quaternion di cui ho bisogno nei vettori …

Il seguente codice è basato su un quaternione (qw, qx, qy, qz), in cui l’ordine è basato sui quaternioni Boost:

boost::math::quaternion quaternion; float qw = quaternion.R_component_1(); float qx = quaternion.R_component_2(); float qy = quaternion.R_component_3(); float qz = quaternion.R_component_4(); 

Per prima cosa devi normalizzare il quaternion:

 const float n = 1.0f/sqrt(qx*qx+qy*qy+qz*qz+qw*qw); qx *= n; qy *= n; qz *= n; qw *= n; 

Quindi puoi creare la tua matrice:

 Matrix( 1.0f - 2.0f*qy*qy - 2.0f*qz*qz, 2.0f*qx*qy - 2.0f*qz*qw, 2.0f*qx*qz + 2.0f*qy*qw, 0.0f, 2.0f*qx*qy + 2.0f*qz*qw, 1.0f - 2.0f*qx*qx - 2.0f*qz*qz, 2.0f*qy*qz - 2.0f*qx*qw, 0.0f, 2.0f*qx*qz - 2.0f*qy*qw, 2.0f*qy*qz + 2.0f*qx*qw, 1.0f - 2.0f*qx*qx - 2.0f*qy*qy, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); 

A seconda della class della matrice, potrebbe essere necessario trasporlo prima di passarlo a OpenGL.

Un modo per farlo, che è piuttosto facile da visualizzare, è applicare la rotazione specificata dal quaternione ai vettori di base (1,0,0), (0,1,0) e (0,0,1) . I valori ruotati forniscono i vettori di base nel sistema ruotato rispetto al sistema originale. Utilizzare questi vettori per formare le righe della matrice di rotazione. La matrice risultante e la sua trasposizione rappresentano le trasformazioni in avanti e inverse tra il sistema originale e il sistema ruotato.

Non ho familiarità con le convenzioni usate da OpenGL, quindi forse qualcun altro può rispondere a quella parte della tua domanda …

Potresti non avere a che fare con una matrice di rotazione. Ecco un modo che sembra essere più veloce della conversione in una matrice e la moltiplicazione di un vettore con esso:

  // move vector to camera position co (before or after rotation depending on the goal) v -= co; // rotate vector v by quaternion q; see info [1] vec3 t = 2 * cross(q.xyz, v); v = v + qw * t + cross(q.xyz, t); 

[1] http://mollyrocket.com/forums/viewtopic.php?t=833&sid=3a84e00a70ccb046cfc87ac39881a3d0

usando glm, puoi semplicemente usare un operatore di casting. quindi per convertire da una matrice4 a una quaternione, semplicemente scrivi

GLM :: mat4_cast (quaternion_name)