如何在pyopengl中使用人脸剔除和深度测试

问题描述 投票:-1回答:1

我正在为一个使用3D形状的学校编写程序,我需要弄清楚如何制作一个立体立方体。当我制作多维数据集时,我得到以下结果:enter image description here

我注意到它按照定义形状的顺序绘制形状。然后,我尝试找到该问题的解决方案,因为我确信许多其他人也遇到了类似的问题,并且遇到了一种称为“面剔除”的方法,该方法在面朝外时将所有面点定义为逆时针,因此在绘制时将其绘制出来。顺时针和opengl可以注意到这一点,而不会绘制它们。我尝试使用此方法,但最终仍得到相同的结果,因此我对自己做错了感到困惑。

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()
python python-3.x opengl pygame pyopengl
1个回答
3
投票

(OpenGL)显示模式已被设置,在调用任何OpenGL指令之前,否则将无效或什至导致错误:

© www.soinside.com 2019 - 2024. All rights reserved.