2009-08-13 11 views
6

tengo que voltear un cuaternión de derecha:
x = left to right
y = front to back
z = top to bottom
Lanzar una cuaternión de derecha a izquierda entregó coordenadas

a izquierda coordenadas dictadas donde:
x = left to right
y = top to bottom
z = front to back

¿Cómo voy a ir haciendo esto?

+1

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 –

+1

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

Respuesta

0
+0

La publicación que ha citado en realidad responde una pregunta diferente: el cartel original parece haber usado "zurdo" para significar "girar en la dirección opuesta". Eso es bastante diferente de intercambiar los ejes Y y Z como lo que cmann quiere hacer. –

0

Una vez que haga eso, ya no tendrá un cuaternión, es decir, las reglas habituales para multiplicar no funcionarán. La identidad i^2 = j^2 = k^2 = ijk = -1 ya no se mantendrá si intercambia j yk (y y z en su sistema de mano derecha).

+0

Entonces, ¿estás diciendo que no puedes cambiar el quaternion? – cmann

+0

@cmann No si desea conservar las propiedades habituales. Supongo que uno podría derivar un conjunto de reglas para los cuaterniones de LH ... ¿pero por qué? ¿Qué está tratando de lograr? Tal vez hay una manera más fácil; quizás la conversión de las coordenadas LH a RH, haciendo sus rotaciones o lo que sea, luego la conversión de nuevo al sistema LH? –

+1

Estoy tratando de exportar datos de Blender a OpenGL – cmann

5

Ok, solo para ser claros, los cuaterniones en realidad no tienen lateralidad. Son sin manos (vea el artículo de wikipedia sobre cuaterniones). SIN EMBARGO, la conversión a una matriz de un cuaternión tiene la lateralidad asociada con él. Consulte http://osdir.com/ml/games.devel.algorithms/2002-11/msg00318.html Si su código realiza esta conversión, es posible que tenga que tener dos funciones separadas para convertir a una matriz para zurdos o una matriz para diestros.

Espero que ayude.

+2

Creo que lo que el usuario realmente está preguntando es "¿Cómo afecta el cambio de la dirección de mi base a mi rotación quaternion?" que es una pregunta válida. La orientación es un dato sobre el espacio vectorial, no sus transformaciones (incluidas las representaciones de cuaterniones y matrices). – rschwieb

+0

Ese hilo osdir no es correcto. La conversión de cuaternión a matriz de 3x3 no implica destreza de ningún tipo. Es puramente "resolver para la matriz M tal que Mv = qv" (suponiendo que está usando vectores de columna). Ver http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ para la derivación. –

1

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í.

3

creo que la solución es:

Given: Right Hand: {w,x,y,z} 
Option 1: Left Hand: {y,-z,-w,-x} 
Option 2: Left Hand: {-y,z,w,x} (equivalent) 
+0

Esto es lo que realmente funcionó aquí; lo único era que necesitábamos {y, z, -w, x} (por lo que 'y' necesitaba negación). Eso podría ser porque estoy haciendo algo mal; esto fue en una aplicación OpenGL donde calculo una matriz modelView, luego la envío como un cuaternario a Unity e intento configurar la cámara allí. –

+0

Esto no debería funcionar a menos que esté usando estructuras de datos de cuaternión realmente extrañas. El valor w es convencionalmente el primer o el último valor en la tupla, y tampoco está directamente asociado con ninguna dirección espacial, por lo que nunca debe terminar en la tercera posición. – Sty

+0

Estaba tratando de ajustar la rotación de un hueso de una armadura a otra con diferente destreza, ¡creo que esto resolvió mi problema con elegancia! ¡Gracias! – Logic1

Cuestiones relacionadas