我有一个我首先要旋转的对象(关于它自己的中心),然后将它转换为某个点。我有一个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));
..并渲染......
不幸的是,当我应用旋转时,物体只围绕原点旋转(离原点越远,轨道越大)。
当我只申请该职位时,它的翻译很好。当我仅应用旋转时,它停留在原点并围绕它的中心旋转(如预期的那样)。那么为什么我同时应用它们会变得奇怪呢?我错过了一些基本的东西吗?
答案 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;
请注意,翻译位于矩阵的右侧,而不是左侧。这意味着翻译首先发生 ,然后相对于翻译旋转。因此,翻译后在空间中发生旋转。
您希望旋转首先发生 。因此,颠倒矩阵乘法的顺序。