旋转后在 3D 世界中平移的正确方法?

Correct way to translate in a 3D world after rotating?

我在我的 3D 世界中生成了一个基本的立方体。我可以围绕相机正确旋转,但是当我旋转后平移时,平移不正确。 例如,如果我旋转 90 度并平移到 Z 轴,它就会像在 X 轴平移一样移动。

glLoadIdentity();
    glRotatef(angle,0,1,0);       //Rotate around the camera.
    glTranslatef(movX,movY,movZ); //Translate after rotating around the camera.
glCallList(cubes[0]);

我需要一些帮助。另外,我尝试在旋转之前进行平移,但旋转不在相机上。它在立方体的边缘。

请记住,在 OpenGL 中,变换应用于 相机 ,而不是渲染的对象;所以你观察到你期望的变换的 inverse

同样在 OpenGL 中,Y 轴和 Z 轴被翻转(Y 是垂直的),因此您观察到水平平移而不是垂直平移。

此外,由于对象绕 Y 轴旋转了 90 度,因此 X 轴和 Z 轴相互替换(其中一个轴反转)。

willywonkadailyblah 的回答只对了一半。因为您使用的是旧的 OpenGL,所以您使用的是旧的矩阵堆栈。当您进行 glRotatef 和 glTranslatef 调用时,您正在修改 modelview matrix。模型视图矩阵实际上是模型的矩阵和相机的视图矩阵预组合(已经相乘)。这些矩阵决定了您的对象在 3D space 中的位置以及您对世界的观察 position/direction 所在的位置。因此,您可以将通话视为移动相机,但将它们视为移动和旋转世界可能更容易。

这些旋转和平移调用是线性变换。这有一个精确的定义,但就我们的目的而言,这意味着您可以将变换表示为一个矩阵,然后将其与点的坐标相乘以将变换应用于一个点。现在矩阵乘法不可交换,意思是 AB != BA。综上所述,旋转然后平移与平移和旋转不同,我想你知道这一点。但是当您平移、旋转和再次平移时,可能会更难理解您实际在做什么。更糟糕的是,即使你在其中加入了一些缩放比例。因此,如果您认真学习 OpenGL,我建议您学习线性变换的工作原理并维护您自己的对象和相机矩阵。

learnopengl.org 是一个优秀的网站,但它教给您的是现代 OpenGL,而不是您目前正在使用的东西。但是关于 transformations and on coordinate systems 的课程可能通常会有帮助,即使没有供您遵循的确切代码