无法将矩阵转换为四元数和后退

时间:2014-04-28 09:19:07

标签: c++ opengl glm-math

我正在尝试将旋转矩阵存储为四元数,然后当我想将其用于转换时,将其转换回来。我正在使用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。

1 个答案:

答案 0 :(得分:6)

我能够弄清楚。四元数将对象的旋转存储在本地空间中。因此,为了获得可以从glm :: lookAt()获得的全视图矩阵,首先需要将局部空间中的四元数转换为矩阵。然后,您将根据所需位置转换单位矩阵,然后执行SRT乘法以导出最终视图矩阵。在这种情况下,你需要反转平移矩阵,因为我们在相机上进行逆向平移,你也会使用适当的" lookAt"矢量与(lookAtPt - position)

的方向相同
/* 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);