我有一个3D相机,其当前旋转存储为四元数,但我无法正确地旋转它。我希望相机每一帧根据鼠标移动在本地轴周围递增地旋转(第一人称射击风格),但旋转效果不正确。它有点起作用,但相机似乎会在不应该的情况下“绕其前向轴滚动”。
我使用以下函数每帧更新旋转:
我使用以下函数每帧更新旋转:
void Camera::rotate(const Quat& q)
{
// m_rot is the current rotation
m_rot = m_rot * q;
}
这是我的四元数乘法函数:
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);
}
我是不是做错了什么,还是这是浮点数误差的问题?
Camera::rotate
函数的错误参数。记录所有对该函数的调用,将q
和m_rot
都写入文件,并进行分析。 - n. m.