KTC*_*KTC 8 c++ math 3d rotation
我有一个3D相机,其当前旋转存储为四元数,我无法正确旋转它.我希望相机根据每帧的鼠标移动(第一人称射击式)逐渐围绕其局部轴旋转,但旋转是错误的.它有点工作,但相机似乎不应该绕其前轴"滚动".
我用这个函数更新每帧的旋转:
void Camera::rotate(const Quat& q)
{
// m_rot is the current rotation
m_rot = m_rot * q;
}
Run Code Online (Sandbox Code Playgroud)
这是我的四元数乘法函数:
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);
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者这是某种浮点错误的事情?
找出问题所在.对于像我想要的鼠标控制的第一人称相机,我想围绕局部x轴旋转以向上和向下看,但是全局y轴用于左右看.
所以这对于x轴是正确的:
m_rot = m_rot * q;
Run Code Online (Sandbox Code Playgroud)
但我需要为y轴做这个:
m_rot = d * m_rot;
Run Code Online (Sandbox Code Playgroud)