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
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.
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
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
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 –
Dziękuję bardzo –