vectores transformaciones rotacion producto matriz homogeneas euler ejemplos eje directores cosenos coordenadas angulos opengl graphics matrix quaternions

opengl - transformaciones - rotacion de coordenadas



Convertir la rotaciĆ³n de Quaternion a la matriz de rotaciĆ³n? (4)

El siguiente código se basa en un cuaternión (qw, qx, qy, qz), donde el orden se basa en los cuaterniones Boost:

boost::math::quaternion<float> 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();

Primero tienes que normalizar el cuaternión:

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

Entonces puedes crear tu matriz:

Matrix<float, 4>( 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);

Dependiendo de su clase de matriz, es posible que tenga que transponerla antes de pasarla a OpenGL.

Básicamente, dado un cuadrante (qx, qy, qz, qw) ... ¿Cómo puedo convertir eso en una matriz de rotación OpenGL? También me interesa qué fila de matriz es "Arriba", "Derecho", "Adelante", etc. Tengo una rotación de cámara en el cuaternión que necesito en vectores ...


Es posible que no tenga que lidiar con una matriz de rotación en absoluto. Aquí hay una forma que parece ser más rápida que convertirla en una matriz y multiplicar un vector con ella:

// 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 + q.w * t + cross(q.xyz, t);

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


Una forma de hacerlo, que es bastante fácil de visualizar, es aplicar la rotación especificada por su cuaternión a los vectores básicos (1,0,0), (0,1,0) y (0,0,1) . Los valores girados dan los vectores de base en el sistema girado en relación con el sistema original. Usa estos vectores para formar las filas de la matriz de rotación. La matriz resultante, y su transposición, representan las transformaciones directas e inversas entre el sistema original y el sistema girado.

No estoy familiarizado con las convenciones utilizadas por OpenGL, así que tal vez alguien más pueda responder esa parte de su pregunta ...


usando glm, simplemente puedes usar un operador de casting. así que para convertir de una matriz 4 a cuaternión, simplemente escriba

glm :: mat4_cast (quaternion_name)