GLM如何结合旋转和平移?

18

我有一个对象,首先想要将它绕着自己的中心旋转,然后将其平移到某个点。我有一个保存旋转的glm :: quat和一个保存需要平移的点的glm :: vec3。

glm::vec3 position;
glm::quat orientation;
glm::mat4 modelmatrix; <-- want to combine them both in here

modelmatrix = glm::translate(glm::toMat4(orientation),position);

然后在我的渲染函数中执行以下操作。

pvm = projectionMatrix*viewMatrix*modelmatrix;
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm));

不幸的是,当我应用旋转时,对象只围绕原点轨道运动(“位置”离原点越远,轨道越大)。

当我仅应用位置时,它可以正常平移。当我仅应用旋转时,它会停留在原点并围绕其中心旋转(符合预期)。那么当我同时应用它们时,为什么会出现问题?我是否遗漏了一些基础知识?

1个回答

30

因为您的应用顺序不正确。通过执行glm::translate(glm::toMat4(orientation),position),您实际上相当于执行了以下操作:

glm::mat4 rot = glm::toMat4(orientation);
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position);
glm::mat4 final = rot * trans;

请注意,矩阵右侧是平移,左侧不是。这意味着先进行平移,然后进行相对于平移的旋转。 因此,旋转发生在平移之后的空间中。

您希望先进行旋转。因此,请颠倒矩阵乘法的顺序。


我曾认为glm::translate将翻译应用于函数的第一个参数。谢谢。 - Jubei
3
它确实将翻译应用于矩阵中,它是右乘操作。这意味着翻译首先发生,而你希望旋转首先发生。 - Nicol Bolas
谢谢你的回答,我今天卡了很久,但即使我弄清楚了我的错误,我仍然找不到任何确认这些函数应该如何工作的证据。 - Adam Goodwin
为什么函数的顺序是这样反过来的?我认为直观的意思应该是对传入的矩阵进行翻译之后再应用。这个选择有具体的原因吗? - Gary Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接