2012-02-17 12 views
5

Estoy en mi ingenio final aquí! Estoy trabajando en la reducción de retardo en mi First Person Shooter, y ahora solo es un caso de agregar algo de extrapolación. Puedo extrapolar la posición; obteniendo las dos últimas posiciones y la velocidad de ellas, luego agregando la velocidad a la posición existente (* tiempo delta). Sin embargo, no puedo hacer lo mismo para la rotación. Por defecto, los ángulos son Euler, pero puedo (y lo hago) convertirlos a cuaterniones, ya que pueden sufrir bloqueo de gimball. ¿Cómo extrapolaría una nueva orientación de 2 orientaciones anteriores? Tengo tiempo entre paquetes, 2 paquetes y la orientación actual.¿Cómo puedo extrapolar una nueva rotación de cuaternión de dos paquetes anteriores?

Respuesta

1

Si representa las dos orientaciones como vectores, el producto vectorial cruzado de ellas le dará el eje de rotación y el producto punto vectorial se puede usar para encontrar el ángulo de rotación.

Puede calcular una velocidad angular de la misma forma en que calculó la velocidad escalar y usarla para calcular la rotación extrapolada alrededor del eje determinado anteriormente.

+0

Muchas gracias –

4

He encontrado una buena respuesta aquí: http://answers.unity3d.com/questions/168779/extrapolating-quaternion-rotation.html

adapté el código para mis necesidades y funciona bastante bien!

Para los dos cuaterniones qa, qb, esto le dará interpolación y extrapolación con la misma fórmula. t es la cantidad de interpolación/extrapolación, t de 0.1 = 0.1 del camino desde qa-> qb, t = -1 -> extrapolar un paso completo desde qa-> qb atrás, etc. Utilicé funciones auto-escritas para permitir uso de cuaterniones/axisAngle con el cv OpenCV :: Mat pero probablemente elegiría Eigen para que en lugar

Quat qc = QuaternionMultiply(qb, QuaternionInverse(qa)); // rot is the rotation from qa to qb  
AxisAngle axisAngleC = QuaternionToAxisAngle(qc); // find axis-angle representation 

double ang = axisAngleC.angle; //axis will remain the same, changes apply to the angle 

if (ang > M_PI) ang -= 2.0*M_PI; // assume rotation to take the shortest path 
ang = fmod(ang * t,2.0*M_PI); // multiply angle by the interpolation/extrapolation factor and remove multiples of 2PI 

axisAngleC.angle = ang; 

return QuaternionMultiply(AxisAngleToQuaternion(axisAngleC),qa); // combine with first rotation 
+0

Hola, lo siento para resucitar un hilo tan antigua. Estoy luchando con este mismo problema (Obtener velocidad angular de Eigen :: Quaterniond, y agregarla con el tiempo actualQuat + VelocityQuat *). ¿Alguna vez usaste esto con C++/Eigen? ¿Qué es 'fmod' en el de arriba? ¡Gracias! – anti

+0

Hola, sí lo usé en C++ pero no con Eigen (usé mis propias clases en los días). @fmod: http://www.cplusplus.com/reference/cmath/fmod –

Cuestiones relacionadas