Mam kamerę 3D z bieżącym obrotem zapisanym jako kwaternion i mam problem z jej prawidłowym obracaniem. Chcę, aby kamera obracała się stopniowo wokół swoich lokalnych osi w oparciu o ruch myszy każdą ramką (styl pierwszoosobowy), ale obrót jest nieprawidłowy. To działa, ale kamera wydaje się "toczyć" wokół swojej osi przedniej, kiedy nie powinna.Aparat kwaternionowy. Jak sprawić, aby obracał się prawidłowo?
zaktualizować rotację każdą klatkę z tej funkcji:
void Camera::rotate(const Quat& q)
{
// m_rot is the current rotation
m_rot = m_rot * q;
}
oto moja funkcja quaternion mnożenie:
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);
}
Czy robię coś źle, czy też jest to jakiś rodzaj zmiennoprzecinkowej-błędu rzecz?
Twoja metoda mnożenia Q wydaje się być poprawna. Może to być rzecz zmiennoprzecinkowa, lub może to być niewłaściwe argumenty do 'Camera :: rotate'. Zrób rejestr wszystkich wywołań tej funkcji, zapisując zarówno 'q' jak i' m_rot' do pliku i przeanalizuj go. –
powiązane: http://stackoverflow.com/questions/16384571/rotate-a-quaternion – danijar