我正在尝试使用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()
这些旋转效果很好但我无法向相机朝向的方向前进。当我修改代码以便能够以这种方式向前移动时,场景将无法正确旋转。如果我回到足够远的地方,那么场景会围成一圈旋转。
答案 0 :(得分:5)
如果您正在编写一个具有摄像机概念的应用程序(我想也是旋转),那么而不是使用glRotate
和glTranslate
操作该对象考虑一下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是向上矢量......逻辑)
希望这可以帮到你