2012-02-17 10 views
5

Sono qui che il mio spirito finirà! Sto lavorando sulla riduzione del lag nel mio sparatutto in prima persona, e ora è solo un caso di aggiungere qualche estrapolazione. Posso estrapolare la posizione; ottenendo le ultime due posizioni e la velocità da esse, quindi aggiungendo la velocità alla posizione esistente (* delta time). Tuttavia, non posso fare lo stesso per la rotazione. Per impostazione predefinita, gli angoli sono Eulero, ma posso (e lo faccio) convertirli in quaternioni in quanto possono subire il blocco del gimball. Come estrapolare un nuovo orientamento da 2 orientamenti precedenti? Ho tempo tra i pacchetti, 2 pacchetti e l'orientamento corrente.Come posso estrapolare una nuova rotazione quaternion da due pacchetti precedenti?

risposta

1

Se si rappresentano i due orientamenti come vettori, il prodotto vettoriale incrociato di essi vi darà l'asse di rotazione e il prodotto punto vettoriale può essere utilizzato per trovare l'angolo di rotazione.

È quindi possibile calcolare una velocità angolare nello stesso modo in cui è stata calcolata la velocità scalare e utilizzarla per calcolare la rotazione estrapolata attorno all'asse determinato in precedenza.

+0

ringrazio molto –

4

ho trovato una buona risposta qui: http://answers.unity3d.com/questions/168779/extrapolating-quaternion-rotation.html

ho adattato il codice per le mie esigenze e funziona abbastanza bene!

Per i due quaternioni qa, qb, ciò fornirà interpolazione ed estrapolazione utilizzando la stessa formula. t è la quantità di interpolazione/estrapolazione, t di 0,1 = 0,1 della via da qa-> qb, t = -1 -> estrapola un intero passo da qa-> qb indietro, ecc. Ho usato le funzioni autodefinite per consentire l'uso dei quaternioni/axisAngle con OpenCV cv :: Mat ma credo che sceglierò Eigen per che invece

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

Salve, mi dispiace per ressurect un vecchio filo tale. Sto lottando con questo stesso problema (ottenendo velocità angolare da Eigen :: Quaterniond e aggiungendolo con il tempo CurrentQuat + VelocityQuat *). L'hai mai usato con C++/Eigen? Cosa significa 'fmod' in quanto sopra? Grazie! – anti

+0

Ciao, sì, ho usato questo sotto C++ ma non con Eigen (usato le mie lezioni nei giorni). @ fmod: http://www.cplusplus.com/reference/cmath/fmod –