opengl - glm 结合旋转和平移

标签 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);

然后在我的渲染函数中,我做到了。
pvm = projectionMatrix*viewMatrix*modelmatrix;
glUniformMatrix4fv(pvmMatrixUniformLocation, 1, GL_FALSE, glm::value_ptr(pvm));

..并渲染...

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

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

最佳答案

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

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

您希望轮换首先发生。所以颠倒矩阵乘法的顺序。

关于opengl - glm 结合旋转和平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9920624/

相关文章:

opengl - 具有纹理对象和采样器的多重纹理理论

c++ - OpenGL:翻转项目

opengl - 如何获得fbx网格的正确位置?

css - 旋转框架但不旋转图像

c++ - 在 OpenGL 中为不同的对象设置单独的 Material 属性

opengl - GLSL顶点着色器双线性采样高度图

c++ - 计算 3 维中的相机 LookAt 位置 (DirectX)

java - Libgdx 近战攻击碰撞检测

html - 在具有交互性的CSS中定位图像

flash - 如果在 transform-style :preserve-3d 内,Firefox 不显示 flash