glm结合旋转和平移

时间:2012-03-29 07:10:01

标签: opengl 3d transform

我有一个我首先要旋转的对象(关于它自己的中心),然后将它转换为某个点。我有一个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 个答案:

答案 0 :(得分:25)

因为您以错误的顺序应用它们。通过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;

请注意,翻译位于矩阵的右侧,而不是左侧。这意味着翻译首先发生 ,然后相对于翻译旋转。因此,翻译后在空间中发生旋转。

您希望旋转首先发生 。因此,颠倒矩阵乘法的顺序。