Камера кватерниона. Как мне заставить его вращаться правильно?

У меня есть 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);
}

Я делаю что-то не так, или это какая-то ошибка с плавающей точкой?

Ответы на вопрос(2)

Ваш ответ на вопрос