3

我已经阅读了几篇关于使用 OpenGL 渲染 3D 场景的过于复杂的文章,但并没有真正找到可以帮助我可视化关于 glRotate 和 glTranslate 调用的场景导航基本概念的东西。

通过对 LWJGL(我的特定 OpenGL 库)提供的示例进行试验,我基本了解了它们的使用效果。我可以使用 glTranslate 移动到一个点,使用 glRotate 围绕该点旋转,使用 glLoadIdentity 快速回到原点或使用 glPopMatrix 回到最后一个 glPushMatrix,它们本质上是位置和旋转的快照。最后,场景将相对于原点渲染到屏幕上。

所以基本上,把一个立方体放在 A 点旋转 B:

  1. glTranslate(Ax,Ay,Az) [现在专注于 A 点]
  2. glRotate(B. , ,*,*) 用于俯仰、偏航和滚动;[现在旋转到旋转 B]
  3. glBegin(GL_QUADS) 和 glVertex3f()x4 相对于对象原点的每个“边”(四边形)
  4. glEnd()
  5. glLoadIdentity() [重置为其他对象的原点,如果只绘制立方体则不需要]

至于“相机”,由于openGL的“眼睛”是固定的,所以场景必须从相机反向移动,以模拟用相机移动眼睛。这是我到目前为止的理解,如果这是错误的,请让我走上正确的道路。

现在针对我的具体情况和问题:

我的“场景”由地形和玩家(一些任意形状,位于与地形相关的位置和“相机”头)组成。视图应该相对于玩家旋转,而玩家相对于地形移动。我希望最终渲染基本上“透视”玩家的头部或相机。我的困惑在于渲染每个部分的翻译/旋转调用的顺序,以及翻译的方向。以下是相对于玩家的“相机”渲染地形和玩家的正确方法吗?

  1. 通过玩家与原点的距离平移远离玩家(移动场景)
  2. 旋转远离玩家的旋转(玩家向右看 40 度,所以向左旋转场景 40)
  3. 渲染地形
  4. 通过 glLoadIdentity 重置
  5. 渲染玩家的头部(如果需要)
  6. 转换为身体/手/任何位置
  7. 旋转远离玩家的旋转(再次第 2 步)
  8. 渲染身体/手/任何东西

另外,旋转对翻译有影响吗?Aka,OpenGL 是否相对于旋转进行平移,或者旋转与平移无关?

4

1 回答 1

1

我可以使用 glTranslate 移动到一个点,使用 glRotate 围绕该点旋转,使用 glLoadIdentity 快速回到原点或使用 glPopMatrix 回到最后一个 glPushMatrix,它们本质上是位置和旋转的快照。

不,不完全。这些功能现在知道场景是什么。他们所做的只是操纵矩阵。这是一篇关于它的优秀文章:

http://www.opengl.org/wiki/Viewing_and_Transformations

使用 OpenGL 时要记住的重要一点是,它不是场景图。它所做的只是将平面点、线和三角形渲染到帧缓冲区。没有像您导航的场景这样的东西。

所以基本上,将一个立方体放在 A 点旋转 B:(...)

是的,你没看错。

至于“相机”,因为openGL的“眼睛”是固定的

好吧,OpenGL 没有相机。它只是通过模型视图矩阵推动顶点,对它们进行照明计算,然后将它们通过投影并将它们映射到视口。

于 2012-04-29T12:19:17.890 回答