Pygame + Opengl + Frustum没有显示任何内容

时间:2011-11-17 02:46:19

标签: python opengl pygame

我正在尝试使用pygame和opengl设置一个简单的三维视图,使用视锥体来设置投影矩阵。这是我的初始化代码:

def initgl(self):
    glClearColor(0.0,0.0,0.0,0.0)
    glViewport(0,0,640,480)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(0,640,480,0,.1,1000.)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

这是我的显示代码:

def paintgl(self):
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    glColor3f(1.0,1.0,1.0)
    glBegin(GL_QUADS)
    glVertex3f(-1.0,-1.0,0.0)
    glVertex3f(1.0,-1.0,0.0)
    glVertex3f(1.0,1.0,0.0)
    glVertex3f(-1.0,1.0,0.0)
    glEnd()
    glPopMatrix()

奇怪的是,当我使用glOrtho时,一切都正确显示。我的问题是,让pygame显示这个opengl代码我做错了什么?

编辑: 如果我渲染到显示列表,显示列表正常工作,只在我调用它时显示,但我的几何图形仍然不存在

请注意,我确实将FOV更改为更正确(接近1和远是10)并且我在Z轴上将几何体推到2,但仍然没有。

修正了它:

我没有朝正确的方向看。 哦哈哈。

2 个答案:

答案 0 :(得分:1)

我从未使用glFrustum(自OpenGL3.3以来,整个矩阵堆栈已被弃用,顺便说一句)但由于第5个参数似乎是近平面,因此几何图形就在它后面!

换句话说,所有顶点已经在世界空间中(因为你没有设置模型视图矩阵)并且Z值为0.0,它们在0.1的近平面后面。

答案 1 :(得分:1)

initgl的代码应放在paintgl中,它更干净,以后会节省很多麻烦。

近平面应选择尽可能远,近平面尽可能接近。您当前的近距离和远距离平面设置会严重降低深度缓冲精度。超过100个单位的任何东西都将经历Z缓冲区战斗(除非它是非常大的几何形状)。


话虽如此:你的几何形状只是在近平面的后面,即太近而不可见。将它向-Z方向移动一点。


更新:代码建议

def paintgl(self):
    glClearColor(0.0,0.0,0.0,0.0)
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

    glViewport(0,0,640,480)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(0,640,480,0,1.,10.)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glTranslatef(0., 0., -2.)

    glColor3f(1.0,1.0,1.0)
    glBegin(GL_QUADS)
    glVertex3f(-1.0,-1.0,0.0)
    glVertex3f(1.0,-1.0,0.0)
    glVertex3f(1.0,1.0,0.0)
    glVertex3f(-1.0,1.0,0.0)
    glEnd()