2012-02-17 9 views
5

Jestem na moim końcu rozumu tutaj! Pracuję nad redukcją opóźnień w mojej strzelance pierwszej osoby, a teraz jest tylko kwestia dodania ekstrapolacji. Mogę ekstrapolować pozycję; uzyskiwanie ostatnich dwóch pozycji i prędkości z nich, a następnie dodawanie prędkości do istniejącej pozycji (* czas delta). Jednak nie mogę zrobić tego samego dla rotacji. Domyślnie kątami są Euler, ale mogę (i robię) przekonwertować je na kwaterach, ponieważ mogą one cierpieć na blokadę zawieszenia. Jak mogę ekstrapolować nową orientację z 2 poprzednich orientacji? Mam czas między pakietami, 2 pakiety i aktualną orientację.Jak mogę ekstrapolować nowy obrót kwaternionowy z dwóch poprzednich pakietów?

Odpowiedz

1

Jeśli reprezentujesz dwie orientacje jako wektory, wektor ich iloczynu daje oś obrotu, a produkt z kropką wektorową może zostać użyty do znalezienia kąta obrotu.

Następnie można obliczyć prędkość kątową w taki sam sposób, jak obliczono prędkość skalarną i użyć jej do obliczenia ekstrapolowanego obrotu wokół osi określonej wcześniej.

+0

Dziękuję bardzo –

4

znalazłem dobrej odpowiedzi tutaj: http://answers.unity3d.com/questions/168779/extrapolating-quaternion-rotation.html

I dostosowany kod do moich potrzeb i działa całkiem dobrze!

Dla dwóch kwater qa, qb da to interpolację i ekstrapolację przy użyciu tej samej formuły. t to ilość interpolacji/ekstrapolacji, t 0,1 = 0,1 drogi od qa-> qb, t = -1 -> ekstrapolacja całego kroku od qa-> qb wstecz, itp. Użyłem funkcji pisanych własnoręcznie, aby umożliwić zastosowanie kwaterniony/axisAngle z OpenCV cv :: Mat ale prawdopodobnie wybrać Eigen na tym, że zamiast

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 
+0

Witam, przykro ressurect taką starą nić. Walczę z tym samym problemem (Uzyskanie prędkości kątowej z Eigen :: Quaterniond i dodanie jej z currentQuat + VelocityQuat * time). Czy używałeś tego z C++/Eigen? Co to jest 'fmod' w powyższym? Dziękuję Ci! – anti

+0

Cześć, tak, użyłem tego pod C++, ale nie z Eigen (użyłem moich własnych klas w dniach). @fmod: http://www.cplusplus.com/reference/cmath/fmod –

Powiązane problemy