No creo que ninguna de estas respuestas sea correcta.
Andres tiene razón en que los cuaterniones no tienen lateralidad. Handedness (o lo que llamaré "convenciones del eje" es una propiedad que los humanos aplican, es cómo mapeamos nuestros conceptos de "adelante, derecha, arriba" a los ejes X, Y, Z.
Estas cosas son ciertas :
- matrices Pure-rotación (ortogonales, determinante 1, etc) se pueden convertir en un cuaternión unidad y la espalda, la recuperación de la matriz original
- matrices que son no rotaciones puros (en particular, queridos. que da la vuelta a un solo eje y por lo tanto tiene determinante -1) no se puede convertir a una unidad de cuaternión y viceversa. Tu rutina mat_to_quat() puede no explotar, pero no te dará es la respuesta correcta (en el sentido de que quat_to_mat (mat_to_quat (M)) == M).
- Un cambio de base que intercambia la destreza manual tiene un determinante -1. Es equivalente a una rotación (tal vez identidad) más un reflejo sobre algún eje.
Para cambiar la base de un cuaternión, por ejemplo, de ROS (diestro) a Unity (zurdo), podemos usar el método de.
mat3x3 rosToUnity = /* construct this by hand */;
mat3x3 unityToRos = rosToUnity.inverse();
quat q_ros = ...;
mat3x3 m_unity = rosToUnity * mat3x3(q_ros) * unityToRos;
quat q_unity = quat(m_unity);
líneas 1-4 son simplemente el método de https://stackoverflow.com/a/39519079/194921: ¿Cómo se realiza un cambio de base en una matriz.
La línea 5 es interesante. Sabemos que mat_to_quat() solo funciona en matrices de rotación pura. ¿Cómo sabemos que m_unity es una rotación pura? Ciertamente es concebible que no lo sea, porque unityToRos y rosToUnity tienen un determinante -1 (como resultado del cambio de dirección).
La respuesta ondulada a mano es que la destreza manual está cambiando dos veces, por lo que el resultado no tiene el cambio de dirección.La respuesta más profunda tiene que ver con el hecho de que las transformaciones de similitud preservan ciertos aspectos del operador, pero no tengo las matemáticas suficientes para hacer la prueba.
Tenga en cuenta que esto le dará un resultado correcto, pero probablemente pueda hacerlo más rápidamente si unityToRos es una matriz simple (digamos, con solo un intercambio de ejes). Pero probablemente debas derivar ese método más rápido expandiendo las matemáticas que se hacen aquí.
favor explique lo que en realidad está tratando de hacer. Como es, tu pregunta no tiene sentido. Está bien no entender cómo hacer algo, pero tienes que dar la historia completa. Mi ** conjetura ** es que su pregunta debería leer algo como "Tengo un cuaternión que representa una rotación en 3 dimensiones, pero debido a que estoy usando un sistema de coordenadas que difiere de la intención * de esta manera particular *, el quaternion no representa la rotación que quiero. ¿Cómo la convierto en un cuaternión que hace la rotación que quiero? Esto es casi un duplicado de http://stackoverflow.com/questions/1263072 –
No pensé que era necesario dar más, pero sí representa una rotación, o tal vez una orientación, en 3d donde el eje z está hacia arriba. Ahora necesito esencialmente intercambiar los ejes z e y para que el eje y esté hacia arriba. Y sí, es similar a mi otra pregunta porque estoy tratando de lograr lo mismo, pero son dos preguntas diferentes. – cmann