2009-05-07 15 views
10

Quaternions son sin duda una opción apropiada para representar rotaciones de objeto internamente. Son simples y eficientes para interpolar y representar una sola orientación sin ambigüedades.Euler angles vs. Quaternions: ¿problemas causados ​​por la tensión entre el almacenamiento interno y la presentación al usuario?

Sin embargo, la presentación de los cuaterniones en la interfaz de usuario generalmente no es adecuada: los ángulos de Euler son mucho más familiares para los usuarios, y sus valores son un poco más intuitivos y predecibles.

Los ángulos de Euler son complicados a nivel de código: requieren que se almacene un orden de rotación, y componer una orientación práctica (ya sea matriz o cuaternión) utilizando este orden y los ángulos asociados es engorroso, por decir lo menos .

Las interpolaciones confiables se realizan de la manera más conveniente usando la representación de cuaternión. ¿Significa esto que debemos convertir constantemente entre una representación de Euler y una representación de cuaternión? ¿Es esto factible en términos de rendimiento?

¿Podemos almacenar las orientaciones como cuaterniones y convertirlas solo para que se muestren al usuario? Esto puede no ser posible porque para cualquier orientación dada hay exactamente una representación de cuaternión pero muchas representaciones de Euler. ¿Cómo 'elegimos' la representación de Euler que corresponde a la que originalmente definió esa orientación? Parece una tarea imposible: efectivamente hemos perdido información al convertirnos en un cuaternión.

¿Podríamos almacenar como ángulos de Euler y luego convertir a cuaterniones según sea necesario? Esto probablemente no es escalable: la conversión de un ángulo de Euler a un cuaternión, la interpolación y la conversión de nuevo probablemente sea un código relativamente caro.

¿Podríamos simplemente almacenar ambas representaciones y usar las más apropiadas para cualquier situación dada? Un gran costo en términos de memoria (imagina las curvas de animación para un esqueleto con alrededor de sesenta huesos) y mantener estos valores sincronizados podría ser costoso, o al menos engorroso.

¿Alguien ha visto, usado o aunque haya alguna solución inteligente para este problema? Sin duda, las tres opciones anteriores no son solo las únicas? ¿Hay algún otro problema relacionado con este dominio que tenga resuelto?

Respuesta

17

Soy ingeniero aeroespacial; He estado usando cuaterniones para el control de actitud y la navegación de la nave espacial durante tres décadas. Aquí hay algunas ideas sobre su situación:

  1. Realizar cualquier tipo de proceso que cambie la orientación con ángulos de Euler es casi imposible. Los ángulos de Euler sufren de singularidades: los ángulos cambiarán instantáneamente hasta 180 grados a medida que otros ángulos pasen por la singularidad; Los ángulos de Euler son virtualmente imposibles de usar para rotaciones secuenciales. Los cuaterniones no sufren ninguno de estos problemas
  2. Existen 12 diferentes secuencias de rotación de ángulos de Euler posibles: XYZ, XYX, XZY, etc. No existe un conjunto "simple" o "correcto" de ángulos de Euler. Para derivar un conjunto de ángulos de Euler, debe saber qué secuencia de rotación está utilizando y atenerse a ella.
  3. Sugiero que realice todas las operaciones de almacenamiento y rotación con cuaterniones y solo convierta un cuaternión a ángulos de Euler cuando se requiera una salida. Cuando hace esto, debe definir qué secuencia de rotación de Euler está utilizando.

I tienen algoritmos para todas estas operaciones y muchos más: cuaterniones a/desde ángulos de Euler de cualquier secuencia de rotación a/de las matrices de rotación (matrices dirección coseno), posición coincidente cuaternión interpolación, tasa, etc. en el extremo o puntos intermedios, dinámica del cuerpo rígida y flexible y cinemática utilizando cuaterniones.

Por favor, póngase en contacto conmigo si puedo ser de ayuda en [email protected]

+0

+1 gana por ser un profesional –

+1

Aceptando esta respuesta porque parece tener la mayoría de los votos. Sin embargo, 1) Sí, desafortunadamente estoy trabajando en el dominio de animación y los artistas esperan tener ángulos de Euler 2) Sí, y de nuevo los animadores esperan poder establecer el orden de rotación en sus huesos arbitrariamente, así que tengo que admitir todas las permutaciones 3) Eso es más o menos lo que estoy haciendo al final. –

0

Soy fan de quaternions. Para que funcionen, ¿podrías reconsiderar tu presentación al usuario? En lugar de presentar la rotación al usuario como una serie de ángulos de Euler en forma de texto, puede elegir un objeto 3D simple y aplicar la rotación del cuaternión al objeto para visualizar visualmente la rotación en vigor.

+0

Si solamente :) Pero me sorprendería si pudiera salirse con la suya en la práctica. Hasta donde yo sé, el flujo de trabajo normal para un artista 3D casi siempre implica conocer los números reales, por lo que si bien puede proporcionarles dispositivos de rotación estilo Max/Maya, en algún momento querrán esa rotación para ser _exactamente_ 30 grados, o al menos ver exactamente qué es esa rotación. –

0

¿Por qué no utilizar Quarternions en el código y convertir la Q en ángulos cuando sea necesario para la visualización?

+0

¿Quiere decir almacenar como cuaterniones y convertir a ángulos de Euler según sea necesario? Debido a las razones que expuse anteriormente, hay muchas representaciones de Euler para una sola orientación ... ¿cuál presenta al usuario? –

+0

¿Por qué no escoges una convención? Digamos dos rotaciones en el marco del laboratorio y una rotación en el marco del cuerpo. Esto requiere que guardes las coordenadas del cuerpo para cada objeto, pero a un artista podría gustarle eso. –

0

Puede representar a la rotación como eje + ángulo de rotación, que es esencialmente el mismo que el cuaternión (hasta un signo)

0

No creo que tiene sentido utilizar ángulos de Euler internamente - usted querrá para usar cuaterniones para todos sus cálculos y, por lo general, no podrá pagar las conversiones en todas partes. En cuanto a la conversión a ángulos de Euler para la UI, ¿sería tan malo si el usuario solo obtiene un ángulo que es equivalente a la entrada original pero se representa de manera diferente? Si haces la conversión correcta, deberías terminar con los ángulos de Euler "más simples" para cualquier cuaternión dado.

+0

Me encantaría salir con eso, pero sospecho que en la práctica los ángulos de Euler 'más simples' son casi tan difíciles de tratar para un artista como los cuaterniones (en el sentido de que no siempre son intuitivos). Los datos de animación presentados como curvas presentarían un desafío particular, creo, ya que puede parecer bastante diferente de lo que el artista espera. –

0

De cuántas conversiones estamos hablando. Parece que está pagando por dos operaciones trascendentales por conversión, que en hardware moderno está disponible en el orden de 100 millones por segundo.Guardaría ambos, Quaternions para precisión y estética y rotaciones euler para preservar la información del usuario. Tal vez agregue una bandera para indicar cuál es el preferido para cualquier objeto dado. Además de eso, solo tiene que realizar la conversión una vez por miembro girado. Una vez que haya calculado una matriz de transformación, se multiplicará hasta que se quede sin vértices.

+0

Esto sería cierto si me preocupaba un costo por vértice o realizar transformaciones para la representación; me preocupa principalmente mezclar varias animaciones para un esqueleto. Entonces estamos hablando de cincuenta huesos y tal vez de 5 a 10 animaciones activas al mismo tiempo. En esta etapa, espero almacenar los datos de animación como cuaterniones, pero también necesito presentar las curvas de animación como ángulos de Euler para el usuario. –

+0

10 cuerpos con 50 miembros cada uno son 500 miembros, multiplicado por 72 fps es 36000 conversiones. No muchos. Puedes hacer 1000 veces eso y seguir usando muy poca CPU – SingleNegationElimination

+0

Ese es un buen punto. Quizás realmente deba ser perfilado antes de descartarlo como una solución. ¡Pero parece tan poco elegante tener que convertir constantemente! Por cierto, no se trata de 10 personajes separados con 50 huesos, es un solo personaje con 10 animaciones activas al mismo tiempo y mezcla entre ellas (es decir,una caminata con una caminata rápida y una vuelta a la parte superior del cuerpo). Pero sospecho que el cálculo es el mismo. –

Cuestiones relacionadas