Как я могу экстраполировать новый кватернионный поворот из двух предыдущих пакетов? - PullRequest
5 голосов
/ 17 февраля 2012

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

Ответы [ 2 ]

4 голосов
/ 12 декабря 2012

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

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

Для двух кватернионов qa, qb это даст вам интерполяцию и экстраполяцию по одной и той же формуле. t - это количество интерполяции / экстраполяции, t 0,1 = 0,1 пути от qa-> qb, t = -1 -> экстраполировать весь шаг назад от qa-> qb и т. д. Я использовал самописные функции, чтобы разрешить использование 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
1 голос
/ 20 февраля 2012

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

...