如何在glm中按四元数旋转任何向量?

时间:2017-07-22 22:02:05

标签: opengl 3d rotation quaternions glm-math

我正在试验四元数旋转,我似乎无法正确...我试图通过四元数旋转每个向量(3个向量= fwVec3,upVec3,rightVec3)但轴不旋转正确 - 例如 - 当我围绕对象右旋转90度时,Vec3使对象面朝下,这意味着它的向上旋转现在旋转90度 - 但是当我围绕对象的新向上旋转时,对象不会围绕它自己的向上旋转,而是,全球世界的向上...

当我说我一直在寻找一段时间时,请相信我,我似乎找不到任何有帮助的东西......

我的代码:

班级成员:

    glm::vec3 m_DirectionWS = glm::vec3(1.0f, 0.0f, 0.0f); // FORWARD
    glm::vec3 m_UpWS        = glm::vec3(0.0f, 1.0f, 0.0f); // UP
    glm::vec3 m_RightWS     = glm::vec3(0.0f, 0.0f, 1.0f); // RIGHT

旋转方法:

    void rotate(const float& angle, const glm::vec3& axis)
    {
        const float& aot = angle / 2.0f;
        const float& cos_aot = sin(aot);
        const float& sin_aot = cos(aot);
        const glm::quat& quaternion = glm::quat(cos_aot, sin_aot * axis[0], sin_aot * axis[1], sin_aot * axis[2]);

        // Multiply each local axis (vec3) with quaternion & normalize them
        m_DirectionWS = glm::conjugate(quaternion) * m_DirectionWS * quaternion;
        m_UpWS        = glm::conjugate(quaternion) * m_UpWS * quaternion;
        m_RightWS     = glm::conjugate(quaternion) * m_RightWS * quaternion;

        m_ModelMtx = glm::lookAt(m_Position, m_Position + m_DirectionWS, m_UpWS)
    }

在主循环中调用rotate函数:

尝试围绕它自己的向上旋转实体旋转

    entity->rotate(0.01f, entity->getUpWS());

我做错了什么?如果我理解正确的话,那就是将每个轴与旋转四元数相乘,然后生成一个模型矩阵。

我正在使用 glm :: lookAt(); 来构建这个矩阵,使用实体在世界空间中的位置,worldpos + entity的前进方向来获取对象面向的位置,它是upvector

我不确定它是乘法的顺序,还是构建矩阵的方式,但是这里的某些东西不正常。

那些了解带有四元数的3D旋转的人可以帮我解决这个例子,使用3个向量作为实体轴fw,up,right和一个四元数(角度,轴)来构建模型矩阵?

0 个答案:

没有答案