2010-11-30 16 views
7

Estoy experimentando con el uso de vectores de ejes y rotaciones en mi motor de juegos de hobby. Este es un vector de 3 componentes a lo largo del eje de rotación con una longitud de la rotación en radianes. Me gustan porque:Combinar vectores de rotación de ejes

  • A diferencia de las matrices quats o de rotación, de hecho me puedo ver los números y visualizar la rotación en mi mente
  • Son un poco menos memoria que los cuaterniones o matrices.
  • puedo representar valores fuera del rango de -Pi a Pi (Esto es importante si almaceno una velocidad angular)

Sin embargo, tengo un bucle estrecho que actualiza la rotación de todos mis objetos (decenas de miles) en función de su velocidad angular. Actualmente, la única forma que conozco de combinar dos vectores de ejes de rotación es convertirlos en cuaterniones, multiplicarlos y luego convertir el resultado a un eje/ángulo. A través del perfil, he identificado esto como un cuello de botella. ¿Alguien sabe un enfoque más directo?

+0

¿Quiere decir que 3 valores representan rotaciones secuenciales alrededor de 3 ejes ortogonales? Básicamente, los ángulos de Euler tales que '[phi, psi, theta]' pueden representar 'RX (phi) * RY (psi) * RZ (theta)'. Si ese es el caso, debe encontrar una forma de construir la matriz de rotación de 3x3 y extraer el ángulo del eje. – ja72

+0

No, no estoy usando ángulos de Euler. Este es el ángulo del eje donde la longitud del vector es el ángulo. – Dwayne

Respuesta

2

Su representación es equivalente a quaternion rotation, siempre que sus vectores de rotación sean unidad de longitud. Si no desea utilizar alguna estructura de datos cuaternarios enlatados, simplemente debe asegurarse de que los vectores de rotación sean de longitud unitaria, y luego calcular el equivalente quaternion multiplications/reciprocal computation para determinar la rotación agregada. Es posible que pueda reducir el número de multiplicaciones o adiciones.

Si su ángulo es lo único que está cambiando (es decir, el eje de rotación es constante), entonces puede simplemente usar una escala lineal del ángulo y, si lo desea, modificarlo para que esté en el rango [0, 2 π). Por lo tanto, si usted tiene una velocidad de rotación de α raidans por segundo, a partir de un ángulo inicial de θ en el tiempo t , entonces el ángulo de rotación final en el tiempo t está dada por:

θ (t) = 0 θ + α (tt 0 ) mod 2 π

a continuación, sólo solicita que la rotación a su colección de vectores.

Si nada de esto mejora su rendimiento, debe considerar el uso de una biblioteca de cuaterniones enlatados, ya que las cosas ya están optimizadas para los tipos de aplicaciones que está ejecutando.

+0

1. Mis vectores no son de longitud unitaria. Su longitud es el ángulo de rotación en radianes. 2. Utilizo una estructura de datos de cuaternión. 3. En muchos casos, mi ángulo no es el único que cambia, pero esto sería una buena verificación de optimización. – Dwayne

+0

"calcular las multiplicaciones de cuaterniones equivalentes/cálculos recíprocos para determinar la rotación agregada" ¿Es esto lo mismo que convertir de eje-ángulo a cuaternión y viceversa? Mi implementación actual proviene de las preguntas frecuentes de Matrix y Quaternion (http://www.j3d.org/matrix_faq/matrfaq_latest.html) – Dwayne

1

Debe usar unidades cuaternarias en lugar de vectores escalados para representar sus rotaciones. Se puede demostrar (no yo) que cualquier representación de rotaciones que utilice tres parámetros tendrá problemas (es decir, es singular) en algún momento. En su caso, ocurre cuando su vector tiene una longitud de 0 (es decir, la identidad) y en longitudes de 2pi, 4pi, etc. En estos casos, la representación se vuelve singular. Los cuaterniones unitarios y las matrices de rotación no tienen este problema.

Según su descripción, parece que está actualizando su estado de rotación como resultado de la integración numérica. En este caso, puede actualizar su estado de rotación convirtiendo su tasa de rotación (\ omega) en una tasa de cuaternión (q_dot).Si representamos el cuaternión como q = [q0 T1 T2 T3], donde q0 es la parte escalar a continuación:

q_dot = E*\omega 

donde

[ -q1 -q2 -q3 ] 
E = [ q0 -q3 q2 ] 
    [ q3 q0 -q1 ] 
    [ -q2 q1 q0 ] 

Luego, su actualización se convierte en

q (k + 1) = q (k) + q_dot * dt

para una integración simple. Puede elegir un integrador diferente si lo desea.

+0

¿Qué significa que la rotación se convierta en singular y qué tipo de problema traerá? – Dwayne

+1

Puede o no causar un problema. Significa que en esos lugares efectivamente pierdes un grado de libertad. Esto a su vez significa que si desea transformar las tasas entre su representación y otra (por ejemplo, cuaterniones), la matriz de transformación (es decir, Jacobian) es singular (no puede invertirse). – Commodore63

2

Puede mantenerlos como valores de eje de ángulo.

Construya una matriz de producto cruzado (anti-symmetric) utilizando los valores del eje angular (x,y,z) y pondere los elementos de esta matriz multiplicándolos por el valor del ángulo. Ahora resuma todas estas matrices de productos cruzados (one for each angle axis value) y encuentre la matriz de rotación final usando la matriz exponencial.

Si la matriz A representa esta matriz de productos cruzados (construido a partir de ángulo valor Axis) entonces,

exp(A) es equivalente a la matriz de rotación R(i.e., equivalent to your quaternion in matrix form).

Por lo tanto,

exp (A1 + A2) = R1 * R2 

probablemente un calucation más caro al final ...