旋转后在3D世界中翻译的正确方法?

时间:2016-07-07 20:16:48

标签: opengl 3d camera rotation

我在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]);

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

willywonkadailyblah的回答是正确的。因为您使用的是旧的OpenGL,所以您使用的是旧的矩阵堆栈。当你正在进行glRotatef和glTranslatef调用时,你正在修改 modelview矩阵。模型视图矩阵实际上是模型的矩阵,并且摄像机的视图矩阵被预先组合(已经相乘)。这些矩阵决定了物体在3D空间中的位置以及您的观察位置/世界方向。因此,您可以将您的呼叫视为移动相机,但将它们视为移动和旋转世界可能更容易。

这些旋转和翻译调用是线性转换。这有一个精确的定义,但就我们的目的而言,它意味着您可以将变换表示为矩阵,并将其与点的坐标相乘以将变换应用于某个点。现在矩阵乘法不是可交换的,意味着AB!= BA。所有这一切都说,当你旋转,然后翻译它不同于翻译和旋转,我想你知道。但是当你翻译,旋转和翻译时,你可能会更难以理解你的实际行动。即使你在那里投入一些比例也更糟糕。因此,如果您认真学习OpenGL,我建议学习线性变换如何工作并维护自己的对象和相机矩阵。

learnopengl.org是一个优秀的网站,但它教你现代OpenGL,而不是你目前使用的。但是transformationscoordinate systems上的课程可能通常很有帮助,即使没有确切的代码供您遵循