âmera @Quaternion. Como faço para girar corretamente?
Tenho uma câmera 3D com sua rotação atual armazenada como um quaternion e estou tendo problemas para girá-la corretamente. Quero que a câmera gire incrementalmente em torno de seus eixos locais, com base no movimento do mouse em cada quadro (estilo de tiro em primeira pessoa), mas a rotação está incorreta. Isso funciona, mas a câmera parece "rolar" em torno do eixo dianteiro quando não deveri
Eu atualizo a rotação de cada quadro com esta função:
void Camera::rotate(const Quat& q)
{
// m_rot is the current rotation
m_rot = m_rot * q;
}
Aqui está minha função de multiplicação de quaternário:
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);
}
Estou fazendo algo errado ou isso é algum tipo de erro de ponto flutuante?