Cuaterniones y rotación alrededor del eje mundial

11

Descargo de responsabilidad: soy un programador profesional de juegos, y uso cuaterniones la mayoría de los días, pero para mí están cerca de la magia negra. Estoy relativamente en casa con las matemáticas, pero los números imaginarios siempre me confundieron. Tiendo a tratar los quats como útiles y terminar invirtiendo las multiplicaciones más de una vez. Trato de razonar sobre ellos como lo haría con matrices con éxito limitado.

De todos modos....

Lo que me desconcierta es lo siguiente. Cuando quiero rotar un objeto alrededor de su eje local, multiplico su rotación con el cuaternión que representa la rotación que quiero aplicar. Por lo tanto, es una rotación en el espacio local.

Ahora, si quiero rotarlo alrededor de un eje en el espacio mundial, mi razonamiento sería: tomar la rotación en el espacio mundial como un cuaternión. Multiplique el inverso de la rotación de mi objeto con este cuaternión. Esto traerá mi rotación mundial en el espacio local. Multiplique mi rotación con este nuevo cuaternión. es decir: newRot = oldRot * (inversa oldRot * worldRot)

Sin embargo, lo que necesito hacer es newRot = oldRot * (inverso oldRot * worldRot) * oldRot.

¿Por qué, después de multiplicar con el quat inverso, aún necesito multiplicar con mi propio quat antes de aplicarlo? Sé que debe haber una razón válida perfecta, pero no puedo razonar mi salida y es frustrante para mí. Probé las diversas preguntas frecuentes y demás, pero la mayoría profundiza en las matemáticas, haciéndolo menos claro.

¿Alguien que me pueda explicar esto como si tuviera 5 años?

Kaj
fuente
¿No se parece un poco a las traducciones de matriz y a las rotaciones (es decir, debe mover su objeto al centro, rotar y luego retroceder cuando desee rotar un elemento alrededor de él mismo: Minv_transl * Mrot * Mtransl)
Valmond
I try to reason about them like I would with matrices- Entonces estás en el camino correcto. Si entendió cómo rotar alrededor de los ejes de los objetos y los ejes del mundo usando matrices, puede hacer lo mismo usando los cuaterniones. El orden de multiplicación es el mismo para ambas, matrices y cuaterniones.
Maik Semder

Respuestas:

11

Los cuaterniones son asociativos:

Menciona que su solución es:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

que es lo mismo que:

newRot = oldRot * inverse oldRot * worldRot * oldRot

que es lo mismo que:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

que en realidad te trae de vuelta a lo que realmente está sucediendo:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

El orden de aplicación está cambiando, eso es todo. Volviendo a las matrices, cuando aplica una matriz de objetos a una matriz de transformación y la almacena como su nueva matriz de objetos, esa es su transformación de espacio local. Cuando aplica la matriz de transformación a la matriz de objetos y la almacena, esa es su transformación mundial. Se trata del orden de aplicación y nada más.

Richard Fabian
fuente
1
+1 para la primera parte, la segunda parte es un poco engañosa. Si solo usa 'rot' en el último ejemplo de código, en lugar de 'localRot' y 'worldRot', el ejemplo se vuelve más claro. De lo contrario, implica que las pudriciones en sí mismas son de alguna manera diferentes . Pero la diferencia radica solo en el orden de multiplicación, como mostró, en lugar de en diferentes cuaterniones ('localRot' y 'worldRot'). 'localTransformed' y 'worldTransformed' serían mejores como: 'rotatedAroundLocalAxis' y 'rotatedAroundWorldAxis'. Eso explicaría las ecuaciones y dejaría obsoleto el último párrafo, que tiene algunos defectos.
Maik Semder
Defectos en el último párrafo: la distinción entre matriz y transformación (ambos son iguales aquí e intercambiables, por lo que es mejor usar solo matriz para evitar confusiones) y los términos "transformación de espacio local" y "transformación de mundo": sería más correcto decir, la primera ecuación te da la 'matriz de local a mundo' después de girarla alrededor del eje local del objeto, la segunda te da la 'matriz de local a mundo' después de rotarla alrededor del eje del mundo. En ambos casos, lo que obtienes es simplemente la 'matriz de local a mundo'. Sin embargo, la primera parte tiene mi +1 de todos modos para el análisis.
Maik Semder
¿+1 @Maik quizás podrías escribir una respuesta separada para aclarar aún más la indiferencia entre las rotaciones y la cuestión del orden de multiplicación? Gracias por el comentario de cualquier manera!
Max Dohme
Ah, ahora tiene sentido. No sabía (ay, que habría estado en las preguntas frecuentes) que la multiplicación del cuaternión era asociativa, por lo que, de hecho, la rotación y la inversa se cancelan entre sí, lo que me da la información que necesitaba, una tiene la rotación local a la derecha y otra a la derecha. izquierda que básicamente dice 'aplicar rotación en el espacio primario' o 'aplicar rotación en el espacio local' ... no es diferente de las matrices. ¡Bastante elemental una vez que lo ves! ¡Gracias!
Kaj