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