如何通过glm中的quaternion旋转任何矢量?

我正在尝试四元数旋转,我似乎无法正确地进行......我试图通过四元数(3个矢量= fwVec3,upVec3,rightVec3)旋转每个矢量,但轴未正确旋转 - 对于实例 - 当我围绕对象的右旋转90度时,对象面朝下,意味着它向上的角度现在旋转了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)
    }

在主循环中调用旋转函数:

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

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

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

我使用glm :: lookAt(); 使用世界空间中实体的位置,worldpos +实体的正向方向来构建这个矩阵,以获得对象所面对的位置和向上位置。

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

任何人都知道四元数三维旋转谁可以帮助我解决这个例子,使用实体轴fw,向上,向右和四元数(角度,轴)的3个向量来构建模型矩阵?

链接地址: http://www.djcxy.com/p/81799.html

上一篇: How to rotate any vector by quaternion in glm?

下一篇: OpenGL cube rotation using quaternions