【发布时间】:2012-03-25 02:16:10
【问题描述】:
我有一个 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);
}
是我做错了什么,还是这是某种浮点错误?
【问题讨论】:
-
您的 Q 乘法方法似乎正确。它可能是浮点数,也可能是
Camera::rotate的错误参数。记录对该函数的所有调用,将q和m_rot写入文件并进行分析。