Jac*_*ack 5 opengl 3d rotation quaternions glm-math
我正在尝试四元数旋转,但似乎无法正确...我正在尝试通过四元数旋转每个向量(3 个向量 = fwVec3、upVec3、rightVec3)但轴没有正确旋转 - 对于实例 - 当我围绕对象的 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
Run Code Online (Sandbox Code Playgroud)
旋转方法:
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)
}
Run Code Online (Sandbox Code Playgroud)
在主循环中调用rotate函数:
试图围绕它自己的向上向量旋转实体
entity->rotate(0.01f, entity->getUpWS());
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如果我理解正确,那就是将每个轴与旋转四元数相乘,然后生成一个模型矩阵。
我正在使用glm::lookAt(); 使用实体在世界空间中的位置、worldpos + 实体的前向方向来构建此矩阵,以获取对象面向的位置及其向上向量。
我不确定这是乘法的顺序,还是我构建矩阵的方式,但这里有些东西不能正常工作。
任何了解四元数的 3D 旋转的人都可以帮助我解决这个例子,使用实体轴 fw、up、right 和四元数(角度、轴)的 3 个向量来构建模型矩阵?