无法在OpenGL中使用相机向前移动

2024-03-28 15:08:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用pyOpenGL做实验,我在让相机正常工作时遇到了麻烦。在

def Draw():

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
     glMatrixMode(GL_MODELVIEW)
     glLoadIdentity()

     glRotatef(roty,1,0,0)
     glRotatef(rotx,0,1,0)
     glTranslate(0,0,eyez)

     glPushMatrix()

     glTranslate(0,0,-80)

     glBegin(GL_QUADS)
     glColor(0,1,0)
     glVertex3f(-50,-5,10)
     glVertex3f(-50,50,10)
     glVertex3f(50,50,10)
     glVertex3f(50,-5,10)

     glColor(1,0,0)
     glVertex3f(-50,-5,10)
     glVertex3f(-50,50,10)
     glVertex3f(-50,50,70)
     glVertex3f(-50,-5,70)
     glEnd()

     glPopMatrix()

     glutSwapBuffers()

这些旋转效果很好,但我无法朝着相机所面对的方向前进。当我修改代码,使其能够以这种方式向前移动时,场景将无法正确旋转。如果我后退足够远,场景就会旋转一圈。在


Tags: defbuffer场景bitcolordrawdepthpyopengl
3条回答

要继续前进,必须首先确定forward在哪里。你需要得到一个指向相机所面对的方向的3D向量。一种方法是将向量(0,0,-1)乘以摄影机矩阵旋转部分的倒数。一般来说,有更简单的方法,但它们都取决于你如何计算你的相机矩阵。在

一旦你有一个单位向量指向相机面对的方向,就很容易了。只需将其乘以你想沿该方向移动的距离,并将其添加到摄影机的当前位置。在

注意,如果使用gluLookAt,还需要同时偏移lookat点。否则,你的相机会移动,但它会试图面对世界空间中一个静止的点。在

虽然我最习惯用JOGL编程,而不是任何其他OpenGL绑定,但我建议您使用以下检查点:

*)在正确的函数中(对我来说,这是JOGL-gleventlister的整形(intx,inty,int-width,int-height)方法中设置了视口和视锥体吗?在

=>;对于视口(用于OpenGL绘图的帧区域),通常只需调用glViewport(x,y,width,height)=>;为GL绘图分配所有画布区域

=>;对于视锥体(摄影机的视野),必须首先切换到“投影矩阵”(glMatrixMode(GL_Projection)),然后设置您的视锥体,然后切换回GL\u MODELVIEW matrix,以便为绘图做好准备。为了定义截头体,我建议您调用glupperspective(45,(float)width/height,0.001f,1000f)。45度半角为45度,宽度/高度表示屏幕比率,0.001f表示距离眼睛(或屏幕)0.001f的近截平面,1000f表示距离眼睛1000f远的截短平面。在

*)您是否考虑过在绘图函数中使用对gluLookAt的调用,就像您建议的那样Ray Toal?我建议你打电话给gluLookAt(

0,0,1,//摄影机设置为(0,0,1),以便它看到0,0,0点

0,0,0,//相机瞄准(0,0,0)

0,1,0)//摄影机的上方向向量为(0,1,0)(因此,Oy是上方向向量。。。逻辑)

希望这对你有帮助

如果您正在编写一个应用程序,它的概念是相机移动(我想也是旋转的),那么不要使用glRotate和{}来操作对象,可以说,gluLookAt可以让您以相机为中心的方式设置事物。在

顺便说一句,gluLookAt是不推荐的,尽管有些人说他们“非常想念它”。如果您希望远离这个被否决的实用函数,请参见the source of this function并在CPU上滚动您自己的矩阵。在

相关问题 更多 >