Soy físico, he estado aprendiendo algo de programación y me he encontrado con mucha gente que usa cuaterniones para rotaciones en lugar de escribir cosas en forma de matriz / vector.
En física, hay muy buenas razones por las que no usamos cuaterniones (a pesar de la extraña historia que se cuenta ocasionalmente sobre Hamilton / Gibbs / etc.). La física requiere que nuestras descripciones tengan un buen comportamiento analítico (esto tiene un significado definido con precisión, pero en algunas formas bastante técnicas que van mucho más allá de lo que se enseña en las clases de introducción normales, por lo que no entraré en detalles). Resulta que los cuaterniones no tienen este buen comportamiento, por lo que no son útiles, y los vectores / matrices sí, así que los usamos.
Sin embargo, restringidas a rotaciones rígidas y descripciones que no utilizan ninguna estructura analítica, las rotaciones 3D pueden describirse de manera equivalente de cualquier manera (o algunas otras formas).
Generalmente, solo queremos un mapeo de un punto X = (x, y, z) a un nuevo punto X '= (x', y ', z') sujeto a la restricción de que X 2 = X ' 2 . Y hay muchas cosas que hacen esto.
La forma ingenua es simplemente dibujar los triángulos que esto define y usar la trigonometría, o usar el isomorfismo entre un punto (x, y, z) y un vector (x, y, z) y la función f (X) = X 'y una matriz MX = X ', o usando cuaterniones, o proyectando componentes del antiguo vector a lo largo del nuevo usando algún otro método (x, y, z) T. (a, b, c) (x', y ', z '), etc.
Desde un punto de vista matemático, estas descripciones son todas equivalentes en esta configuración (como un teorema). Todos tienen el mismo número de grados de libertad, el mismo número de restricciones, etc.
Entonces, ¿por qué los cuaterniones parecen preferidos a los vectores?
Las razones habituales que veo son que no hay bloqueo de cardán o problemas numéricos.
El argumento de no bloqueo de cardán parece extraño, ya que este es solo un problema de ángulos de Euler. También es solo un problema de coordenadas (al igual que la singularidad en r = 0 en coordenadas polares (el jacobiano pierde rango)), lo que significa que es solo un problema local y se puede resolver cambiando coordenadas, girando fuera de la degeneración, o usando dos sistemas de coordenadas superpuestos.
Estoy menos seguro acerca de los problemas numéricos, ya que no sé en detalle cómo se implementarían ambos (y cualquier alternativa). He leído que volver a normalizar un cuaternión es más fácil que hacerlo para una matriz de rotación, pero esto solo es cierto para una matriz general; una rotación tiene restricciones adicionales que trivializan esto (que están incorporadas en la definición de cuaterniones) (de hecho, esto tiene que ser cierto ya que tienen el mismo número de grados de libertad).
Entonces, ¿cuál es el motivo del uso de cuaterniones sobre vectores u otras alternativas?
Respuestas:
El bloqueo del cardán es una de las razones, aunque como dices, solo es un problema con los ángulos de Euler y se puede resolver fácilmente. Los ángulos de Euler todavía se usan cuando la memoria es una preocupación, ya que solo necesita almacenar 3 números.
Para cuaterniones frente a una matriz de rotación de 3x3, el cuaternión tiene la ventaja en tamaño (4 escalares frente a 9) y velocidad (la multiplicación de cuaterniones es mucho más rápida que la multiplicación de matrices de 3x3).
Tenga en cuenta que todas estas representaciones de rotaciones se utilizan en la práctica. Los ángulos de Euler usan la menor memoria; las matrices usan más memoria pero no sufren de bloqueo Gimbal y tienen buenas propiedades analíticas; y los cuaterniones logran un buen equilibrio de ambos, siendo livianos, pero libres de bloqueo Gimbal.
fuente
Bueno, yo también soy físico. ¡Y hay algunas situaciones en las que los cuaterniones simplemente se mueven! Armónicos esféricos, por ejemplo. Tienes dos átomos que se dispersan, intercambiando un electrón: ¿cuál es la transferencia de espín orbital? Con los cuaterniones es solo una multiplicación, es decir, la suma de los exponentes de las funciones base SH expresadas como cuaterniones. (Sin embargo, convertir los polinomios de Legendre en notación de cuaterniones es un poco tedioso).
Pero estoy de acuerdo, no son una herramienta universal, y especialmente en la mecánica de carrocería rígida serían muy engorrosos de usar. Sin embargo, para citar la respuesta de Bertrand Russell en la pregunta de un estudiante sobre cuántas matemáticas necesita saber un físico: "¡Tanto como sea posible!"
De todos modos: ¿Por qué amamos los cuaterniones en gráficos por computadora? Porque tienen varias propiedades atractivas. Primero, uno puede interpolarlos muy bien, lo cual es importante si uno está animando cosas giratorias, como las extremidades alrededor de una articulación. Con un cuaternión es solo multiplicación escalar y normalización. Expresar esto con una matriz requiere la evaluación de sen y cos y luego construir una matriz de rotación. Entonces, multiplicar un vector con un cuaternión es aún más barato que pasar por una multiplicación de matriz de vector completo, también es aún más barato si se agrega una traducción después. Si considera un sistema de animación esquelética para un personaje humano, donde se deben evaluar muchas traslaciones / rotaciones para una gran cantidad de vértices, esto tiene un gran impacto.
Otro buen efecto secundario del uso de cuaterniones es que cualquier transformación es inherentemente ortonormal. Con las matrices de traducción, uno debe volver a ortonormalizar cada par de pasos de la animación, debido a errores de redondeo numérico.
fuente
Muchas aplicaciones 3D como el uso de ángulos de Euler para definir la orientación de un objeto. Para los simuladores de vuelo en particular, representan una forma teóricamente útil de almacenar la orientación de una manera que sea fácilmente modificable.
También debe tener en cuenta que cosas como "cambiar de coordenadas, salir de la degeneración o usar dos sistemas de coordenadas superpuestos", requieren esfuerzo. Esfuerzo significa código. Y el código significa rendimiento. La pérdida de rendimiento cuando usted no tiene que no es una cosa buena para muchas aplicaciones 3D. Después de todo, ¿qué se puede ganar con todos estos trucos, si con solo usar cuaterniones obtendrá todo lo que necesita?
Los problemas numéricos surgen cuando se trata de múltiples rotaciones consecutivas de una orientación. Imagina que tienes un objeto en el espacio. Y cada corte de tiempo, le aplica un pequeño cambio de guiñada. Después de cada cambio, debe volver a normalizar la orientación; de lo contrario, surgirán problemas de precisión y arruinarán las cosas.
Si usa matrices, cada vez que haga una multiplicación de matrices, debe volver a ortonormalizar la matriz. La matriz que está ortonormalizando aún no es una matriz de rotación, por lo que no estaría muy seguro de esa fácil ortonormalización. Sin embargo, puedo estar seguro de esto:
No será tan rápido como una normalización vectorial 4D. Eso es lo que utilizan los cuaterniones para normalizar después de sucesivas rotaciones.
La normalización de cuaterniones es barata. Incluso la normalización de la matriz de rotación especializada no será tan barata. Una vez más, el rendimiento importa.
También hay otro problema que las matrices no resuelven fácilmente: la interpolación entre dos orientaciones diferentes.
Cuando se trata de un personaje 3D, a menudo tiene una serie de transformaciones que definen la ubicación de cada hueso en el personaje. Esta jerarquía de huesos representa al personaje en una pose particular.
En la mayoría de los sistemas de animación, para calcular la pose de un personaje en un momento determinado, se interpola entre transformaciones. Esto requiere interpolar las transformaciones correspondientes.
Interpolar dos matrices es ... no trivial. Al menos, lo es si quieres algo que se parezca a una matriz de rotación al final. Después de todo, el propósito de la interpolación es producir algo a medio camino entre las dos transformaciones.
Para los cuaterniones, todo lo que necesita es un lerp 4D seguido de una normalización. Eso es todo: tome dos cuaterniones e interpole linealmente los componentes. Normaliza el resultado.
Si desea una interpolación de mejor calidad (y a veces lo hace), puede resaltar el lerp esférico . Esto hace que la interpolación se comporte mejor para orientaciones más dispares. Esta matemática es mucho más difícil y requiere más operaciones para matrices que cuaterniones.
fuente
Opinión: Los cuaterniones son agradables.
Matriz de rotación: desventaja menor : la multiplicación de matrices es ~ 2 veces más lenta que los cuaterniones. Ventaja menor : la multiplicación matriz-vector es ~ 2 veces más rápida y grande. Gran desventaja : ¡Normalización! Ghram-Shmit es asimétrico, lo que no da una respuesta precisa de orden superior cuando se hacen ecuaciones diferenciales. Los métodos más sofisticados son muy complejos y costosos.
Eje (ángulo = longitud del eje) Ventaja menor : pequeña. Desventaja moderada : la multiplicación y la aplicación a un vector son lentas con trig. Desventaja moderada : singularidad del polo norte en longitud = 2 * pi, ya que todas las direcciones de los ejes no hacen nada. Más código (y depuración) para reescalarlo automáticamente cuando se acerca a 2pi.
fuente
Absolutamente no solo queremos eso. Hay una sutileza muy importante que mucha gente pasa por alto . La construcción de la que estás hablando (dibuja los triángulos y usa trigonometría, etc.) rotará correctamente un vector hacia el otro. Pero hay infinitas rotaciones que harán esto. En particular, puedo ir después de que hayas hecho tu rotación y luego rotar todo el sistema alrededor del vector X '. Eso no cambiará la posición de X 'en absoluto. La combinación de tu rotación y la mía es equivalente a otra sola rotación (ya que las rotaciones forman un grupo ). En general, debe poder representar dicha rotación.
Resulta que usted puede hacer esto con sólo un vector. (Esa es la representación eje-ángulo de las rotaciones ). Pero combinar rotaciones en la representación eje-ángulo es difícil. Los cuaterniones lo facilitan, junto con muchas otras cosas. Básicamente, los cuaterniones tienen todas las ventajas de otras representaciones y ninguno de los inconvenientes. (Aunque admito que puede haber aplicaciones específicas para las que alguna otra representación puede ser mejor).
fuente
Y son buenas razones.
Como ya parece comprender, los cuaterniones codifican una sola rotación alrededor de un eje arbitrario en lugar de tres rotaciones secuenciales en el espacio 3 de Euler. Esto hace que los cuaterniones sean inmunes al bloqueo del cardán .
Además, algunas formas de interpolación se vuelven agradables y fáciles de hacer, como SLERP .
Desde una perspectiva de rendimiento, ¿por qué su solución es mejor?
Podría continuar, pero los cuaterniones son solo una posible herramienta a utilizar. Si no se ajustan a sus necesidades, no los utilice.
fuente
Vale la pena tener en cuenta que todas las propiedades relacionadas con la rotación no son realmente propiedades de los cuaterniones: son propiedades de las parametrizaciones Euler-Rodrigues , que es la estructura real de 4 elementos que se utiliza para describir una rotación 3D.
Su relación con los cuaterniones se debe exclusivamente a un artículo de Cayley, "Sobre ciertos resultados relacionados con los cuaterniones", donde el autor observa la correlación entre la multiplicación de los cuaterniones y la combinación de parametrizaciones de Euler-Rodrigues. Esto permitió aplicar aspectos de la teoría de Quaternion a la representación de rotaciones y especialmente a la interpolación entre ellas.
Puede leer el documento aquí: https://archive.org/details/collmathpapers01caylrich . Pero en ese momento, no había conexión entre los Cuaterniones y la rotación y Cayley se sorprendió bastante al descubrir que sí:
Sin embargo, no hay nada intrínseco en los cuaterniones que dé algún beneficio a la rotación. Los cuaterniones no evitan el bloqueo del cardán; Las parametrizaciones de Euler-Rodrigues sí lo hacen. Es probable que muy pocos programas de computadora que realicen rotación implementen realmente tipos de Quaternion que son valores matemáticos complejos de primera clase. Desafortunadamente, un malentendido del papel de los cuaterniones parece haberse filtrado en alguna parte, lo que resultó en que bastantes estudiantes gráficos desconcertados aprendieran los detalles de las matemáticas complejas con múltiples constantes imaginarias y luego se desconcertaron sobre por qué esto resuelve los problemas con la rotación.
fuente
Una respuesta que alguien podría leer: Hay problemas tediosos con todas las representaciones. Los cuaterniones son más pequeños que las matrices, pero la multiplicación de cuaterniones no es un mero producto escalar vectorial o algo así, y de hecho lleva más tiempo en una computadora que el producto escalar de dos matrices 3x3. (Las computadoras son muy buenas para operar con matrices ordinarias)
Sin embargo, las matrices tienen otras características molestas. Por ejemplo, no son criaturas estables a largo plazo. Cuando se modelan rotaciones en el espacio 3D, normalmente se acumulan rotaciones una encima de la otra en una matriz de orientación, que es solo una matriz de rotación única que almacena la orientación de un marco de referencia. Este proceso, a lo largo de millones de adiciones, hará que la matriz O se desvíe de una forma de matriz de rotación estricta. Esto puede evitarse reconfigurando periódicamente la matriz, pero hay condiciones en las que esto no es trivial. Es decir, el caso de no rotación de la matriz de identidad.
Querría encontrar una representación de eje-ángulo (o representación de cuaternión) de la rotación y luego reproducir una matriz para eso. La mayoría de los algoritmos producen un vector cero y luego encuentran una división cero en este caso. En este tipo de casos, también es generalmente una mala idea tratar de evitar tales casos con soluciones del tipo "si 0 entonces ...", ya que a) las bifurcaciones son lentas yb) aún puede terminar con la máquina epsilon aparte de singularidad y terminar con horrendos errores.
fuente