四元数相机.如何使其正确旋转?

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)

我做错了什么,或者这是某种浮点错误的事情?

KTC*_*KTC 7

找出问题所在.对于像我想要的鼠标控制的第一人称相机,我想围绕局部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)