我正在试验四元数旋转,我似乎无法正确...我试图通过四元数旋转每个向量(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和一个四元数(角度,轴)来构建模型矩阵?