Ho una camera 3D con la sua rotazione corrente memorizzata come un quaternione, e ho problemi a ruotarla correttamente. Voglio che la fotocamera ruoti in modo incrementale attorno ai suoi assi locali basandosi sul movimento del mouse per ogni fotogramma (in prima persona, in stile sparatutto), ma la rotazione è errata. Funziona, ma la fotocamera sembra "rotolare" attorno al suo asse in avanti quando non dovrebbe.Fotocamera Quaternion. Come faccio a ruotare correttamente?
aggiorno la rotazione ogni fotogramma con questa funzione:
void Camera::rotate(const Quat& q)
{
// m_rot is the current rotation
m_rot = m_rot * q;
}
Ecco la mia funzione di quaternion moltiplicazione:
Quat Quat::operator*(const Quat &rhs) const
{
// quaternion elements in w,x,y,z order
Vector4d res;
res[0] = m_q[0]*rhs.m_q[0] - m_q[1]*rhs.m_q[1] -
m_q[2]*rhs.m_q[2] - m_q[3]*rhs.m_q[3];
res[1] = m_q[0]*rhs.m_q[1] + m_q[1]*rhs.m_q[0] +
m_q[2]*rhs.m_q[3] - m_q[3]*rhs.m_q[2];
res[2] = m_q[0]*rhs.m_q[2] - m_q[1]*rhs.m_q[3] +
m_q[2]*rhs.m_q[0] + m_q[3]*rhs.m_q[1];
res[3] = m_q[0]*rhs.m_q[3] + m_q[1]*rhs.m_q[2] -
m_q[2]*rhs.m_q[1] + m_q[3]*rhs.m_q[0];
return Quat(res);
}
sto facendo qualcosa di sbagliato, o si tratta di un qualche tipo di errore di floating-point cosa?
Il metodo di moltiplicazione Q sembra corretto. Potrebbe essere una cosa a virgola mobile, o potrebbe essere argomenti errati per 'Camera :: ruota '. Fai un log di tutte le chiamate a quella funzione, scrivendo sia 'q' che' m_rot' su file, e analizzalo. –
correlati: http://stackoverflow.com/questions/16384571/rotate-a-quaternion – danijar