Básicamente, dado un quaterion (qx, qy, qz, qw) ... ¿Cómo puedo convertir eso a una matriz de rotación de OpenGL? También me interesa saber qué fila de matriz es "Arriba", "Derecha", "Adelante", etc ... Tengo una rotación de cámara en cuaternión que necesito en vectores ...¿Convertir la rotación de Quaternion a la matriz de rotación?
Respuesta
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();
primer lugar hay 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;
continuación, puede crear y nuestra 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.
Una forma de hacerlo, lo cual es bastante fácil de visualizar, es aplicar la rotación especificada por su cuaternión a los vectores de base (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. Utilice estos vectores para formar las filas de la matriz de rotación. La matriz resultante, y su transposición, representan las transformaciones directa e inversa entre el sistema original y el sistema rotado .
no estoy familiarizado con las convenciones utilizadas por OpenGL, por lo que tal vez alguien más puede responder que parte de su pregunta ...
Sí me olvidó que podía hacer esto ... Voy a darle una oportunidad – Polaris878
matemáticamente correcto, pero computacionalmente más caro hacerlo así. – teodron
Lo probaría, porque esta versión usa instrucciones que podrían ser específicas para algunos hardware (estoy pensando específicamente en sombreadores de GPU), así que aunque es probable, no estaría tan seguro de que sea más costoso computacionalmente ... –
Puede que no tenga que ocuparse de una matriz de rotación. Aquí está una manera que parece ser más rápido que la conversión a una matriz y la multiplicación de un vector con él:
// 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
El enlace está muerto. – Dan
usando GLM, sólo tiene que utilizar un operador de fundición. así convertir de un matrix4 a cuaternión, sólo tiene que escribir
GLM :: mat4_cast (quaternion_name)
- 1. Obtener la rotación euler de Quaternion?
- 2. Animación de rotación de cubos de Quaternion
- 3. cuaterniones rotación matriz de OpenGL
- 4. Componente de una rotación quaternion alrededor de un eje
- 5. Rotación de matriz in situ
- 6. Java - Rotación de la imagen
- 7. explicación de la matriz de rotación de iOS
- 8. Obtener matriz de rotación entre dos matrices de transformación (XNA)
- 9. ¿Cómo representar una rotación de matriz 4x4?
- 10. Cuaternión matemática para la rotación?
- 11. Conversión de UIImage a CGImage causa rotación de la imagen
- 12. ¿Fuerza la dirección de rotación de CALayer?
- 13. ¿Puedo interpolar la rotación de dos Quaternions creados a partir de Yaw/Pitch/Roll?
- 14. OpenGL Rotación
- 15. ActionItem perdido en la rotación de pantalla
- 16. Interpolación de rotación
- 17. Rotación de página TCPDF
- 18. Obtener solo la rotación de un CGAffineTransform
- 19. Ocultar barra de navegación en la rotación
- 20. coincidencia de plantilla con la rotación
- 21. CALayer con la animación de rotación
- 22. contentOffset de UIScrollView durante la rotación
- 23. ResultReceiver no supera la rotación de pantalla
- 24. ¿Cómo convertir una matriz de rotación 3x3 en una matriz 4x4?
- 25. Aplicar rotación 3D a la vista de iPhone
- 26. Vectores de rotación frente a cuaterniones
- 27. Deshabilitar la rotación automática para una UIView
- 28. ¿La rotación de ID de sesión mejora la seguridad?
- 29. UIToolbar altura en la rotación dispositivo
- 30. UISplitViewController EXC_BAD_ACCESS en la rotación usando ARC
fyi this parece una interpretación de fila mayor, para cualquiera que mire esto. Debería funcionar, como sucede al pasar a OpenGL, ya que los resultados column-major y row-major generan la misma matriz lineal. Sin embargo, si utiliza esto con una biblioteca column-major para multiplicar con otra matriz, podría tener problemas dependiendo de cómo funciona su biblioteca. – johnbakers
Agradable. Así que el impulso puede hacer prácticamente todo lo que estoy buscando. –
Vea también: http://stackoverflow.com/questions/1274936/flipping-a-quaternion-from-right-to-left-handed-coordianates que menciona que los cuaterniones NO tienen lateralidad, sino que las matrices HACEN. Así que puede que tenga que modificar 6 celdas de la transformación anterior, conjugarlas por orden. Celdas 21,31,32,12,13,23. (Aparte de eso, acabo de pegar este código y cambié ligeramente para mi biblioteca en particular, y funcionó muy bien. ¡Gracias!) –