将矩阵转换为四元数并返回时出现问题

Trouble converting matrix to quaternion and back

本文关键字:返回 问题 四元数 转换      更新时间:2023-10-16

我正试图将旋转矩阵存储为四元数,然后当我想使用它进行变换时,将其转换回。我使用的是glm库,它提供了mat4_cast和quat_cast。然而,当我执行以下代码时:

glm::mat4 origTest = glm::lookAt(position, lookAtPt, up);
glm::quat quatTest = glm::quat_cast(origTest);
glm::mat4 mat4Test = glm::mat4_cast(quatTest);

我得到了origTest和mat4Test的不同值。我是不是遗漏了什么?position、lookAtPt和up是glm::vec3。

我想明白了。四元数存储对象在局部空间中的旋转。因此,为了导出可以从glm::lookAt()获得的全视图矩阵,首先需要将局部空间中的四元数转换为矩阵。然后,您将单位矩阵转换为所需位置,并执行SRT乘法以导出最终视图矩阵。在这种情况下,您需要反转平移矩阵,因为我们正在相机上进行反向平移,并且您还将使用与(lookAtPt-位置)方向相同的适当"lookAt"矢量

/* Mat4 to Quat */
glm::vec3 lookAtPt = direction;
glm::mat4 rotMatrix = glm::lookAt(glm::vec3(0), lookAtPt, up);
glm::quat rotation = glm::quat_cast(rotMatrix);
/* Quat to Mat4 */    
glm::mat4 identityMat = glm::mat4(1.0f);
glm::mat4 rotMatrix = glm::mat4_cast(rotation);   //rotation is glm::quat
glm::mat4 transMatrix = glm::translate(identityMat, position); 
glm::mat4 viewMatrix = rotMatrix * glm::inverse(transMatrix);