我正在尝试使用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,但仍然没有。
修正了它:
我没有朝正确的方向看。 哦哈哈。
答案 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()