首页 > 解决方案 > OpenGL - 对象轴方向;glm::translate 和 glm::rotate 的顺序

问题描述

我发现将物体倾斜(23.4 度)会使局部或物体空间改变相同的角度。以下代码出现渲染循环之前。

model[1] = glm::mat4(1.0f);
...
spheres[1].m_currentPosition = glm::vec3(65.0f, 0.0f, -60.0f);
...
model[1] = glm::translate(model[1], spheres[1].m_currentPosition);
model[1] = glm::rotate(model[1], glm::radians(-23.4f), glm::normalize(glm::vec3(0.0f, 0.0f, 1.0f)));

在渲染循环中,除了围绕我在渲染循环之前指定的内容进行常规旋转之外,我几乎没有代码,

rotationAxis[1] = glm::normalize(glm::vec3(0.0f, 1.0f, 0.0f));

这将导致围绕倾斜 23.4 度的轴旋转,以下图像是静态屏幕截图:

线在世界坐标 (0, 0, 0) 处相交的位置。

===

如果我颠倒前两行,即,

model[1] = glm::rotate(model[1], glm::radians(-23.4f), glm::normalize(glm::vec3(0.0f, 0.0f, 1.0f)));
model[1] = glm::translate(model[1], spheres[1].m_currentPosition);

结果是, 在此处输入图像描述

===

在渲染循环中,我可以围绕指定的 旋转球体rotationAxis[1],尽管在这两种情况下,旋转都是围绕一个倾斜的 23.4 度轴穿过球体的蓝色顶部和底部。

球体 (x, y, z) 位置的任何其他变化都与这个现在倾斜的参考系有关,在这两种情况下也是如此。

我想要的是通过计算新的(x,y,z)坐标,然后通过与前一个(x,y,z)坐标的差异进行平移,使球体在水平线的平面中“绕行”。这种倾斜会导致我不得不调整倾斜的坐标。虽然这几乎是不可能的,但我正在寻找一个更直接的解决方案,并更好地了解正在发生的事情。

我已经阅读了 OpenGL 中平移和旋转的顺序,但更改顺序并不能解决我的问题。

标签: c++openglglm-math

解决方案


推荐阅读