Как я могу экстраполировать новое вращение кватернионов из двух предыдущих пакетов?

Я здесь в своем уме! Я работаю над уменьшением лагов в моем шутере от первого лица, и теперь это просто случай добавления некоторой экстраполяции. Я могу экстраполировать позицию; получение двух последних позиций и скорости из них, а затем прибавление скорости к существующей позиции (* дельта-время). Однако я не могу сделать то же самое для вращения. По умолчанию углы Эйлера, но я могу (и делаю) преобразовать их в кватернионы, поскольку они могут страдать от блокировки кардана. Как мне экстраполировать новую ориентацию из двух предыдущих ориентаций? У меня есть время между пакетами, 2 пакета и текущая ориентация.


person Angus Hollands    schedule 17.02.2012    source источник


Ответы (2)


Я нашел здесь хороший ответ: http://answers.unity3d.com/questions/168779/extrapolating-quaternion-rotation.html

Я адаптировал код под свои нужды, и он работает неплохо!

Для двух кватернионов qa, qb это даст вам интерполяцию и экстраполяцию с использованием той же формулы. t - величина интерполяции / экстраполяции, t 0,1 = 0,1 пути от qa-> qb, t = -1 -> экстраполировать целый шаг от qa-> qb назад и т. д. Я использовал самописные функции, чтобы разрешить использование of quaternions / axisAngle с opencv cv :: Mat, но я бы, вероятно, выбрал для этого Eigen

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
person Oliver Zendel    schedule 12.12.2012
comment
Привет, извините, что восстанавливаю такую ​​старую ветку. Я борюсь с этой же проблемой (получение угловой скорости из Eigen :: Quaterniond и добавление ее с помощью currentQuat + VelocityQuat * time). Вы когда-нибудь использовали это с c ++ / Eigen? Что fmod в приведенном выше? Спасибо! - person anti; 10.06.2017
comment
Привет, да, я использовал это в C ++, но не в Eigen (в те дни использовал свои собственные классы). @fmod: cplusplus.com/reference/cmath/fmod - person Oliver Zendel; 13.06.2017

Если вы представляете две ориентации как векторы, их векторное векторное произведение даст вам ось вращения, а векторное скалярное произведение можно использовать для определения угла поворота.

Затем вы можете рассчитать угловую скорость так же, как вы вычисляли скалярную скорость, и использовать ее для вычисления экстраполированного вращения вокруг оси, определенной ранее.

person caf    schedule 20.02.2012