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

时间:2011-07-16 19:36:55

标签: python opengl camera

我正在尝试使用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()

这些旋转效果很好但我无法向相机朝向的方向前进。当我修改代码以便能够以这种方式向前移动时,场景将无法正确旋转。如果我回到足够远的地方,那么场景会围成一圈旋转。

3 个答案:

答案 0 :(得分:5)

如果您正在编写一个具有摄像机概念的应用程序(我想也是旋转),那么而不是使用glRotateglTranslate操作该对象考虑一下gluLookAt,它允许你以相机为中心的方式进行设置,可以这么说。

顺便说一句,gluLookAt已被弃用,尽管有些人说他们“错过了很多”。如果您希望远离这个已弃用的实用程序功能,请参阅the source of this function并在CPU上滚动您自己的矩阵。

答案 1 :(得分:2)

要继续前进,您必须先确定 的前进位置。您需要获得指向相机方向的3D矢量。一种方法是将矢量(0,0,-1)乘以相机矩阵的旋转部分的倒数。通常,有更简单的方法,但它们都取决于你如何计算你的相机矩阵。

一旦你有一个单位矢量指向相机的方向,这很容易。只需乘以你想要移动的方向多远,并将其添加到相机的当前位置。

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

答案 2 :(得分:0)

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

*)你有没有设置正确的函数(对我来说它是JOGL GLEventListener的重塑(int x,int y,int width,int height)方法),视口和平截头体?

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

=>对于平截头体(相机视野),您必须先切换到投影矩阵(glMatrixMode(GL_PROJECTION)),然后设置平截头体,然后切换回GL_MODELVIEW矩阵以便为您的绘图做好准备。我建议你,为了定义平截头体,调用gluPerspective(45,(浮点)宽度/高度,0.001f,1000f)。 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是向上矢量......逻辑)

希望这可以帮到你