Python 如何在pyopengl中使用面剔除和深度测试
我正在为学校做一个使用3D形状的程序,我需要弄清楚如何制作实心立方体。当我制作立方体时,我最终得到以下结果: 我注意到它是按照我定义的顺序绘制形状的。然后,我试图找到解决这个问题的方法,因为我确信其他许多人也有类似的问题,我遇到了一个叫做面剔除的问题,它将所有面点定义为逆时针,当面朝外时,因此渲染时,它将顺时针绘制,opengl可以注意到这一点,而不会绘制它们。Python 如何在pyopengl中使用面剔除和深度测试,python,python-3.x,opengl,pygame,pyopengl,Python,Python 3.x,Opengl,Pygame,Pyopengl,我正在为学校做一个使用3D形状的程序,我需要弄清楚如何制作实心立方体。当我制作立方体时,我最终得到以下结果: 我注意到它是按照我定义的顺序绘制形状的。然后,我试图找到解决这个问题的方法,因为我确信其他许多人也有类似的问题,我遇到了一个叫做面剔除的问题,它将所有面点定义为逆时针,当面朝外时,因此渲染时,它将顺时针绘制,opengl可以注意到这一点,而不会绘制它们。 我试着用这个,结果还是一样,所以我对自己做错了什么感到困惑 import pygame import time from pygame
我试着用这个,结果还是一样,所以我对自己做错了什么感到困惑
import pygame
import time
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
block = [
[0,1,0],
[1,0,0],
[1,0,1],
[0,0,1],
[1,1,0],
[0,1,1]
]
def Cube(x,y,z):
glBegin(GL_TRIANGLES)
glColor3f(block[0][0], block[0][1], block[0][2]) # N
glVertex3f(x + .5, y + 1, z + .5)
glVertex3f(x - .5, y + 1, z + .5)
glVertex3f(x - .5, y, z + .5)
glVertex3f(x - .5, y, z + .5)
glVertex3f(x + .5, y, z + .5)
glVertex3f(x + .5, y + 1, z + .5)
glColor3f(block[1][0], block[1][1], block[1][2]) # S
glVertex3f(x - .5, y + 1, z - .5)
glVertex3f(x + .5, y + 1, z - .5)
glVertex3f(x + .5, y, z - .5)
glVertex3f(x + .5, y, z - .5)
glVertex3f(x - .5, y, z - .5)
glVertex3f(x - .5, y + 1, z - .5)
glColor3f(block[2][0], block[2][1], block[2][2]) # W
glVertex3f(x + .5, y + 1, z - .5)
glVertex3f(x + .5, y + 1, z + .5)
glVertex3f(x + .5, y, z + .5)
glVertex3f(x + .5, y, z + .5)
glVertex3f(x + .5, y, z - .5)
glVertex3f(x + .5, y + 1, z - .5)
glColor3f(block[3][0], block[3][1], block[3][2]) # E
glVertex3f(x - .5, y + 1, z + .5)
glVertex3f(x - .5, y + 1, z - .5)
glVertex3f(x - .5, y, z - .5)
glVertex3f(x - .5, y, z - .5)
glVertex3f(x - .5, y, z + .5)
glVertex3f(x - .5, y + 1, z + .5)
glColor3f(block[4][0], block[4][1], block[4][2]) # U
glVertex3f(x + .5, y + 1, z - .5)
glVertex3f(x - .5, y + 1, z - .5)
glVertex3f(x - .5, y + 1, z + .5)
glVertex3f(x - .5, y + 1, z + .5)
glVertex3f(x + .5, y + 1, z + .5)
glVertex3f(x + .5, y + 1, z - .5)
glColor3f(block[5][0], block[5][1], block[5][2]) # D
glVertex3f(x + .5, y, z + .5)
glVertex3f(x + .5, y, z - .5)
glVertex3f(x - .5, y, z - .5)
glVertex3f(x - .5, y, z - .5)
glVertex3f(x - .5, y, z + .5)
glVertex3f(x + .5, y, z + .5)
glEnd()
def main():
pygame.init()
display = (800,600)
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDepthMask(GL_TRUE)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glEnable(GL_CULL_FACE)
glCullFace(GL_BACK)
glFrontFace(GL_CCW)
glShadeModel(GL_SMOOTH)
glDepthRange(0.0,1.0)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
gluPerspective(45, (display[0]/display[1]), 0.1, 100.0)
glTranslatef(0.0, 0.0, -5)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
glRotatef(1, 3, 1, 1,)
glClearDepth(1.0)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
Cube(0,0,0)
glCullFace(GL_BACK)
pygame.display.flip()
time.sleep(.01)
main()
在调用任何OpenGL指令之前,已设置(OpenGL)显示模式,否则不会产生任何影响,甚至不会导致错误:
pygame.display.set_模式(显示,DOUBLEBUF | OPENGL)
glClearColor(0.0,0.0,0.0,0.0)
glClearDepth(1.0)
glDepthMask(GL_TRUE)
glDepthFunc(GL_LESS)
glEnable(GL_深度_测试)
glEnable(GL_CULL_面)
正面(背面)
GLU正面(GL_CCW)
glShadeModel(GLU平滑)
gldepsrange(0.0,1.0)
如果这样做,网格将正常工作并正确绘制网格
顺便说一下,并非所有面都是按逆时针缠绕顺序绘制的。它必须是: def多维数据集(x,y,z): glBegin(GLU三角形) glColor3f(块[0][0],块[0][1],块[0][2])#N glVertex3f(x+0.5,y+1,z+0.5) glVertex3f(x-.5,y+1,z+0.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x+.5,y,z+.5) glVertex3f(x+0.5,y+1,z+0.5) glColor3f(块[1][0],块[1][1],块[1][2])#S glVertex3f(x-.5,y+1,z-.5) glVertex3f(x+0.5,y+1,z-.5) glVertex3f(x+.5,y,z-.5) glVertex3f(x+.5,y,z-.5) glVertex3f(x-.5,y,z-.5) glVertex3f(x-.5,y+1,z-.5) glColor3f(块[2][0],块[2][1],块[2][2])#W glVertex3f(x+0.5,y+1,z-.5) glVertex3f(x+0.5,y+1,z+0.5) glVertex3f(x+.5,y,z+.5) glVertex3f(x+.5,y,z+.5) glVertex3f(x+.5,y,z-.5) glVertex3f(x+0.5,y+1,z-.5) glColor3f(块[3][0],块[3][1],块[3][2])#E glVertex3f(x-.5,y+1,z+0.5) glVertex3f(x-.5,y+1,z-.5) glVertex3f(x-.5,y,z-.5) glVertex3f(x-.5,y,z-.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x-.5,y+1,z+0.5) glColor3f(块[4][0],块[4][1],块[4][2])#U glVertex3f(x+0.5,y+1,z-.5) glVertex3f(x-.5,y+1,z-.5) glVertex3f(x-.5,y+1,z+0.5) glVertex3f(x-.5,y+1,z+0.5) glVertex3f(x+0.5,y+1,z+0.5) glVertex3f(x+0.5,y+1,z-.5) glColor3f(块[5][0],块[5][1],块[5][2])#D glVertex3f(x+.5,y,z-.5) glVertex3f(x+.5,y,z+.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x-.5,y,z-.5) glVertex3f(x+.5,y,z-.5) 格伦德() 在调用任何OpenGL指令之前,已设置(OpenGL)显示模式,否则不会产生任何影响,甚至不会导致错误:
pygame.display.set_模式(显示,DOUBLEBUF | OPENGL)
glClearColor(0.0,0.0,0.0,0.0)
glClearDepth(1.0)
glDepthMask(GL_TRUE)
glDepthFunc(GL_LESS)
glEnable(GL_深度_测试)
glEnable(GL_CULL_面)
正面(背面)
GLU正面(GL_CCW)
glShadeModel(GLU平滑)
gldepsrange(0.0,1.0)
如果这样做,网格将正常工作并正确绘制网格
顺便说一下,并非所有面都是按逆时针缠绕顺序绘制的。它必须是: def多维数据集(x,y,z): glBegin(GLU三角形) glColor3f(块[0][0],块[0][1],块[0][2])#N glVertex3f(x+0.5,y+1,z+0.5) glVertex3f(x-.5,y+1,z+0.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x+.5,y,z+.5) glVertex3f(x+0.5,y+1,z+0.5) glColor3f(块[1][0],块[1][1],块[1][2])#S glVertex3f(x-.5,y+1,z-.5) glVertex3f(x+0.5,y+1,z-.5) glVertex3f(x+.5,y,z-.5) glVertex3f(x+.5,y,z-.5) glVertex3f(x-.5,y,z-.5) glVertex3f(x-.5,y+1,z-.5) glColor3f(块[2][0],块[2][1],块[2][2])#W glVertex3f(x+0.5,y+1,z-.5) glVertex3f(x+0.5,y+1,z+0.5) glVertex3f(x+.5,y,z+.5) glVertex3f(x+.5,y,z+.5) glVertex3f(x+.5,y,z-.5) glVertex3f(x+0.5,y+1,z-.5) glColor3f(块[3][0],块[3][1],块[3][2])#E glVertex3f(x-.5,y+1,z+0.5) glVertex3f(x-.5,y+1,z-.5) glVertex3f(x-.5,y,z-.5) glVertex3f(x-.5,y,z-.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x-.5,y+1,z+0.5) glColor3f(块[4][0],块[4][1],块[4][2])#U glVertex3f(x+0.5,y+1,z-.5) glVertex3f(x-.5,y+1,z-.5) glVertex3f(x-.5,y+1,z+0.5) glVertex3f(x-.5,y+1,z+0.5) glVertex3f(x+0.5,y+1,z+0.5) glVertex3f(x+0.5,y+1,z-.5) glColor3f(块[5][0],块[5][1],块[5][2])#D glVertex3f(x+.5,y,z-.5) glVertex3f(x+.5,y,z+.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x-.5,y,z+.5) glVertex3f(x-.5,y,z-.5) glVertex3f(x+.5,y,z-.5) 格伦德()
为什么不使用glEnable(GL\U深度测试);glEnable(GL_CULL_面)代码>?正如@Spektre所说,这与其说是一个面部剔除问题,不如说是一个深度测试问题。这可能是想要的结果,但如果没有深度测试,您的面将按照您定义的顺序绘制,如果您有两个立方体,则后面的立方体可能会呈现在前面的立方体之上。@florentteppe深度测试已启用(
glEnable(GL\u depth\u test)
)。图像与代码不对应@除非文本函数的组合错误