OpenGL(简单)场景& “透视”相机的对象导航基础知识

时间:2012-04-29 10:26:16

标签: opengl 3d rotation translation scene

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

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

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

  1. glTranslate(A.x,A.y,A.z)[现在专注于A点]
  2. glRotate(B. ,*,*)用于俯仰,偏航和翻滚; [现在旋转到旋转B]
  3. glBegin(GL_QUADS)和glVertex3f()x4,每个'side'(四边形)相对于对象的原点
  4. glEnd()
  5. glLoadIdentity()[重置为其他对象的原点,如果只绘制多维数据集则不需要]
  6. 对于“相机”,由于openGL的“眼睛”是固定的,场景必须从相机反向移动,以模拟用相机移动眼睛。 到目前为止,这是我的理解,如果这是错误的,请把我放在正确的道路上。

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

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

    1. 通过玩家与原点的距离(移动场景)离开玩家
    2. 旋转远离玩家的旋转(玩家向右看40度,因此向左旋转场景40)
    3. 渲染地形
    4. 通过glLoadIdentity重置
    5. 渲染玩家的头部(如果需要)
    6. 翻译成身体/手/任何位置
    7. 旋转远离玩家的旋转(再次执行步骤2)
    8. 渲染身体/手/无论
    9. 另外,旋转对翻译有影响吗? Aka,OpenGL是否就旋转进行翻译,还是旋转与翻译无关?

1 个答案:

答案 0 :(得分:1)

  

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

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

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

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

  

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

是的,你说得对。

  

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

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