rotacion quaternion octoniones matricial los introducción forma cuaterniones coordenadas aplicaciones angulares 3d rotation quaternions

3d - quaternion - octoniones



Eficiente velocidad angular de cuaternión (1)

Tengo una orientación expresada con un cuaternión y una velocidad angular expresada como un cuaternión o un número (radianes por segundo alrededor de la orientación original). Entiendo cómo hacer esto usando la conversión a axis-angle, pero ese método es bastante costoso desde el punto de vista computacional y no es una opción realista. ¿Cómo voy a modificar el cuaternión de orientación dado un intervalo de tiempo (en segundos)? Necesito una solución para ambos casos (el cuaternión y el número). Sin embargo, la conversión de un caso en el otro es aceptable y puede ser preferible dependiendo de la complejidad computacional de los diversos algoritmos / fórmulas requeridas para las conversiones.


Para actualizar la orientación, necesita multiplicar la orientación actual mediante la rotación delta. Esta es una operación costosa comparable con conversión de ángulo de eje.

La forma común de representar la velocidad angular es el "mapa exponencial" en el vector 3d paralelo con el eje de rotación y la magnitud de la velocidad de rotación (radianes por segundo). La conversión a delta rotation quaternion se parece a

Quaternion deltaRotation(const Vector3& em, double deltaTime) { Quaternion q; Vector3 ha = em * deltaTime *0.5; // vector of half angle double l = ha.norm(); // magnitude if( l > 0 ) { double ss = sin(l)/l; q = Quaternion(cos(l), ha.x()*ss, ha.y()*ss, ha.z()*ss); }else{ q = Quaternion(1.0, ha.x(), ha.y(), ha.z()); } return q; }

Si su deltaTime es pequeño y la velocidad de rotación es pequeña, puede usar la aproximación por el primer multiplicador de la serie Taylor. Pero debe normalizar el cuaternión de resultados para evitar la inestabilidad numérica con mayor frecuencia.

Quaternion deltaRotationAppx1(const Vector3& em, double deltaTime) { Vector3 ha = em * deltaTime *0.5; // vector of half angle return Quaternion(1.0, ha.x(), ha.y(), ha.z()); }