matrix aplicaciones - ¿Por qué se usan los cuaterniones para las rotaciones?




matriz de (7)

Soy físico y he estado aprendiendo algo de programación, y he encontrado 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 ocasionalmente se cuenta 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 más técnicas que van más allá de lo que se enseña en las clases de introducción normales, así 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, restringido a rotaciones rígidas y descripciones que no usan ninguna estructura analítica, las rotaciones 3D se pueden describir de manera equivalente (o de 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 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 viejo 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 ser preferibles a los vectores?

Las razones usuales que veo no son bloqueo de cardán ni problemas numéricos.

El argumento de bloqueo sin cardán parece extraño, ya que este es solo un problema de ángulos 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 puede resolverse cambiando las coordenadas, rotando 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án ambos (y cualquier alternativa). He leído que volver a normalizar un cuaternión es más fácil que hacer eso 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 la razón del uso de cuaterniones sobre vectores u otras alternativas?


Answers

Las razones usuales que veo no son bloqueo de gimble, o problemas numéricos.

Y son buenas razones.

Como ya parece entender, los cuaterniones codifican una sola rotación alrededor de un eje arbitrario en oposición a tres rotaciones secuenciales en Euler 3-space. 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 .

... o utilizando dos sistemas de coordenadas superpuestos.

Desde una perspectiva de rendimiento, ¿por qué es mejor su solución?

Podría continuar, pero los cuaterniones son solo una herramienta posible de usar. Si no se ajustan a tus necesidades, entonces no los uses.


En física, hay muy buenas razones por las que no usamos cuaterniones (a pesar de la extraña historia que ocasionalmente se cuenta 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 más técnicas que van más allá de lo que se enseña en las clases de introducción normales, así 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.

Bueno, yo soy un físico, también. ¡Y hay algunas situaciones donde los cuaterniones simplemente se balancean! Armónicos esféricos, por ejemplo. Tienes dos átomos dispersos, intercambiando un electrón: ¿cuál es la transferencia de spin orbital? Con los cuaterniones, es solo multiplicación, es decir, sumando los exponentes de las funciones base SH expresadas como cuaterniones. (Obtener los polinomios de Legendre en notación de cuaternión es un poco tedioso).

Pero estoy de acuerdo, no son una herramienta universal, y especialmente en la mecánica rígida del cuerpo serían muy engorrosos de usar. Sin embargo, para citar a Bertrand Russell, responda en cuestión de un alumno sobre la cantidad de matemáticas que un físico necesita saber: "¡Tanto como sea posible!"

De todos modos: ¿Por qué amamos quaternions en gráficos de computadora? Porque tienen varias propiedades atractivas. Primero, 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 sin y cos, y luego construir una matriz de rotación. Entonces, multiplicar un vector por un cuaternión es aún más barato que pasar por una multiplicación de matriz de vectores completa, pero también es más barato si uno agrega una traducción después. Si se considera un sistema de animación esquelética para un personaje humano, donde se debe evaluar una gran cantidad de rotaciones / traducción 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 inherentemente es ortonormal. Con las matrices de traducción se debe volver a ortormalizar cada par de pasos de animación, debido a errores numéricos de redondeo.


El bloqueo cardánico 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 versus una matriz de rotación de 3x3, el cuaternión tiene la ventaja en tamaño (4 escalares vs. 9) y velocidad (la multiplicación del cuaternión es mucho más rápida que la multiplicación de la matriz 3x3).

Tenga en cuenta que todas estas representaciones de rotaciones se utilizan en la práctica. Los ángulos de Euler usan la menor cantidad de memoria; las matrices usan más memoria pero no sufren bloqueo de Gimbal y tienen buenas propiedades analíticas; y los cuaterniones logran un buen equilibrio de ambos, siendo livianos, pero libres de la traba del cardán.


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 que X ^ 2 = X '^ 2. Y hay muchas cosas que hacen esto.

Absolutamente no solo queremos eso. Hay una sutileza muy importante que mucha gente extraña . La construcción de la que estás hablando (dibuja los triángulos y usa trigonometría, etc.) rotará correctamente un vector en el otro. Pero hay infinitas rotaciones que harán esto. En particular, puedo venir después de haber hecho su 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 su rotación y la mía es equivalente a otra rotación individual (ya que las rotaciones forman un grupo ). En general, debe ser capaz de representar cualquier rotación.

Resulta que puedes hacer esto solo con un vector. (Esa es la representación del ángulo del eje de las rotaciones ). Pero combinar rotaciones en la representación del ángulo del eje es difícil. Quaternions lo hace fácil, junto con muchas otras cosas. Básicamente, los cuaterniones tienen todas las ventajas de otras representaciones, y ninguno de los inconvenientes. (Aunque admitiré que puede haber aplicaciones específicas para las cuales alguna otra representación puede ser mejor).


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 de matriz de vectores 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. Moderada desventaja : la multiplicación y la aplicación a un vector es lenta con trigonometría. Moderada desventaja : singularidad del polo norte a la longitud = 2 * pi, ya que todas las direcciones del eje no hacen nada. Más código (y depuración) para reescalarlo automáticamente cuando se acerca a 2pi.


El argumento de bloqueo sin cardán parece extraño, ya que este es solo un problema de ángulos 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 puede resolverse cambiando las coordenadas, rotando fuera de la degeneración, o usando dos sistemas de coordenadas superpuestos.

Muchas aplicaciones 3D utilizan á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 fácilmente modificable.

También debe tener en cuenta que cosas como "cambio de coordenadas, rotación fuera de la degeneración o el uso de dos sistemas de coordenadas superpuestos" requieren esfuerzo. Esfuerzo significa código. Y el código significa rendimiento. Perder rendimiento cuando no es necesario no es algo bueno para muchas aplicaciones 3D. Después de todo, ¿qué se gana con todos estos trucos? Si solo usas cuaterniones obtendrás todo lo que necesitas.

Estoy menos seguro acerca de los problemas numéricos, ya que no sé en detalle cómo se implementarán ambos (y cualquier alternativa). He leído que volver a normalizar un cuaternión es más fácil que hacer eso 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).

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 segmento de tiempo, aplica un pequeño cambio de guiñada a él. Después de cada cambio, necesita volver a normalizar la orientación; de lo contrario, los problemas de precisión aparecerán y arruinarán las cosas.

Si usa matrices, cada vez que haga una multiplicación de matrices, debe volver a ortormalizar la matriz. La matriz que está ortormalizando todavía no es una matriz de rotación, por lo que no estaría tan seguro de esa fácil ortormalización. Sin embargo, puedo estar seguro de esto:

No será tan rápido como una normalización vectorial 4D. Eso es lo que los cuaterniones usan para normalizar después de sucesivas rotaciones.

La normalización del cuaternión es barata. Incluso la normalización de la matriz de rotación especializada no será tan barata. De nuevo, el rendimiento importa.

También hay otro problema que las matrices no hacen fácilmente: la interpolación entre dos orientaciones diferentes.

Al tratar con 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 el 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, uno interpola entre transformaciones. Esto requiere interpolar las transformaciones correspondientes.

La interpolación de dos matrices es ... no trivial. Al menos, es si quieres algo que se asemeje 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: tomar dos cuaterniones e interpolar linealmente los componentes. Normaliza el resultado.

Si desea una interpolación de mejor calidad (y a veces lo hace), puede sacar 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.


Bueno, si una fila tiene NAs, esa fila se elimina (por defecto):

d <- data.frame(x=c(1,1,2), y=c(2,2,4), z=c(4,NA,8))
m <- model.matrix(x ~ ., data=d)

nrow(d) # 3
nrow(m) # 2

Este comportamiento está controlado por la opción "na.action":

options(na.action="na.fail")
m <- model.matrix(x ~ ., data=d) # Error: missing values in object