Я здесь в своем уме! Я работаю над уменьшением лагов в моем шутере от первого лица, и теперь это просто случай добавления некоторой экстраполяции. Я могу экстраполировать позицию; получение двух последних позиций и скорости из них, а затем прибавление скорости к существующей позиции (* дельта-время). Однако я не могу сделать то же самое для вращения. По умолчанию углы Эйлера, но я могу (и делаю) преобразовать их в кватернионы, поскольку они могут страдать от блокировки кардана. Как мне экстраполировать новую ориентацию из двух предыдущих ориентаций? У меня есть время между пакетами, 2 пакета и текущая ориентация.
Как я могу экстраполировать новое вращение кватернионов из двух предыдущих пакетов?
Ответы (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
fmod
в приведенном выше? Спасибо!
- person anti; 10.06.2017
Если вы представляете две ориентации как векторы, их векторное векторное произведение даст вам ось вращения, а векторное скалярное произведение можно использовать для определения угла поворота.
Затем вы можете рассчитать угловую скорость так же, как вы вычисляли скалярную скорость, и использовать ее для вычисления экстраполированного вращения вокруг оси, определенной ранее.