Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL(简单)场景&;“的对象导航基础”;“了望”;照相机_Opengl_3d_Rotation_Translation_Scene - Fatal编程技术网

OpenGL(简单)场景&;“的对象导航基础”;“了望”;照相机

OpenGL(简单)场景&;“的对象导航基础”;“了望”;照相机,opengl,3d,rotation,translation,scene,Opengl,3d,Rotation,Translation,Scene,我已经阅读了几篇关于使用OpenGL渲染3D场景的过于复杂的文章,但还没有真正找到一些可以帮助我可视化场景导航的基本概念(关于glRotate和glTranslate调用) 通过实验LWJGL(我的特定OpenGL库)提供的示例,我非常基本地了解了它们的使用会产生什么效果。我可以使用glTranslate移动到一个点,glRotate围绕该点旋转,glLoadIdentity捕捉回原点,或glPopMatrix捕捉回上一个glPushMatrix,它们本质上是位置和旋转的快照。最后,场景将相对于

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

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

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

  • glTranslate(A.x,A.y,A.z)[现在关注点A]
  • glRotate(B,,*,*)用于俯仰、偏航和滚转;[现在轮换到B轮]
  • glBegin(GL_四边形)和glVertex3f()x4表示相对于对象原点的每个“边”(四边形)
  • 格伦德()
  • glLoadIdentity()[对于其他对象重置为原点,如果仅绘制多维数据集,则不需要此选项]
  • 至于“摄影机”,由于openGL的“眼睛”是固定的,因此场景必须从摄影机反向移动,以模拟使用摄影机移动眼睛。这是我迄今为止的理解,如果这是错误的,请让我走上正确的道路

    关于我的具体情况和问题:

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

  • 按玩家距原点的距离平移玩家(移动场景)
  • 旋转远离玩家的旋转(玩家向右看40度,所以将场景向左旋转40度)
  • 渲染地形
  • 通过glLoadIdentity重置
  • 渲染玩家的头部(如果需要)
  • 转换到身体/手/任何位置
  • 旋转远离玩家的旋转(再次执行第2步)
  • 渲染身体/手/任何东西
  • 还有,旋转对翻译有影响吗?又名,OpenGL是相对于旋转进行平移,还是旋转对平移没有影响

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

    不完全是。这些函数现在已经了解了场景是什么。他们所做的就是操纵矩阵。这里有一篇关于它的优秀文章:

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

    基本上,把一个立方体放在点a,旋转B: (……)

    是的,你说对了

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


    OpenGL没有摄像头。只需将顶点推过modelview矩阵,对其进行照明计算,然后将其通过投影并映射到视口。

    正如一开始所说的那样,这种方法似乎是正确的,但会使事情变得复杂。我认为您必须首先理解视口、投影和模型视图的概念。。。当你明白了这些之后,一切都变得简单了。。。尝试搜索那些关键词……你也可以尝试在2D中进行一些实验,以熟悉旋转和平移,在这两种情况下更容易看到发生了什么。通常,您需要在原点进行旋转,然后进行平移。如果我想画一个太阳系,让月亮绕着地球转,我把地球移到原点,把月亮放在离它一定距离的地方,让月亮绕着地球转,然后把整个地球转的月亮包移(平移)到太阳系的适当位置,投影基本上是您的深度和视野,而modelview是您在3D世界中的位置和旋转。视口是所有对象的组合方式,是三维对象映射到的二维平面。平移和旋转调用都在modelview中,但它们之间的交互方式对我来说有点神秘。@MKatz-这是有道理的。到目前为止,我的2D叠加渲染都是基于顶点的,没有平移,但我将测试一些平移/旋转调用,看看到底发生了什么,然后看看是否可以将其应用于3D场景。