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
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.
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
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
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 –
- 1. ¿Qué es una rotación de cuaternión?
- 2. Cuaternión matemática para la rotación?
- 3. Componente de una rotación quaternion alrededor de un eje
- 4. ¿Convertir la rotación de Quaternion a la matriz de rotación?
- 5. jQuery: ¿cómo puedo animar una rotación div?
- 6. Cómo usar la rotación del cuaternión en la escena Three.js json
- 7. Obtener matriz de rotación entre dos matrices de transformación (XNA)
- 8. girando un cuaternión en 1 eje?
- 9. ¿Cómo revertir las dos confirmaciones anteriores?
- 10. Cuando tengo dos cuaterniones de orientación, ¿cómo encuentro que el cuaternario de rotación necesita ir de uno a otro?
- 11. sistema de coordenadas giratorias a través de un cuaternión
- 12. ¿Cómo eliminar la advertencia de "rotación de dos etapas"?
- 13. ¿Cómo puedo encontrar una lista de paquetes instalados de Homebrew?
- 14. Shell: insertar un/nueva línea en blanco dos líneas anteriores patrón
- 15. ¿Cómo representar una rotación de matriz 4x4?
- 16. ¿Cómo detener todas las animaciones anteriores en Jquery antes de ejecutar una nueva?
- 17. Lanzar una cuaternión de derecha a izquierda entregó coordenadas
- 18. selenio, ¿cómo puedo seleccionar una nueva ventana
- 19. MySQL combinar dos columnas y añadir en una nueva columna
- 20. Combinar dos imágenes en una nueva imagen
- 21. Cómo empujar una nueva sucursal sin historial
- 22. ¿Puedo interpolar la rotación de dos Quaternions creados a partir de Yaw/Pitch/Roll?
- 23. ¿Construir una aplicación OS X compatible con versiones anteriores, cuando hay una API nueva?
- 24. Nuget, ¿cómo puedo especificar la ubicación de los paquetes?
- 25. 'Diferencia' entre dos cuaterniones
- 26. ¿Cómo puedo crear una nueva lista de la lista existente?
- 27. ¿Cómo puedo crear una nueva ventana desde dentro de QML?
- 28. ¿Cómo puedo instalar una nueva versión de gcc en ubuntu
- 29. ¿Cómo puedo probar la compatibilidad con versiones anteriores de la API entre los ensamblados de .NET
- 30. Cómo eliminar versiones anteriores de Xcode
Muchas gracias –