glm结合旋转和平移

Jub*_*bei 14 opengl 3d transform glm-math

我有一个我首先想要旋转的物体(关于它自己的中心)然后将它转换到某个点.我有一个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);
Run Code Online (Sandbox Code Playgroud)

然后在我的渲染功能我做..

pvm = projectionMatrix*viewMatrix*modelmatrix;
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm));
Run Code Online (Sandbox Code Playgroud)

..并渲染......

不幸的是,当我应用旋转时,物体围绕原点旋转(离原点越远,轨道越大).

当我只申请该职位时,它的翻译很好.当我仅应用旋转时,它停留在原点并围绕它的中心旋转(如预期的那样).那么为什么我同时应用它们会变得奇怪呢?我错过了什么基本的东西?

Nic*_*las 26

因为你以错误的顺序应用它们.通过这样做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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Jubei:它**将翻译应用于矩阵.它正确倍增它.这意味着当您希望首先发生旋转时,翻译首先发生*. (3认同)