【问题标题】:How to use face culling and depth test in pyopengl如何在pyopengl中使用人脸剔除和深度测试
【发布时间】:2019-01-07 01:50:21
【问题描述】:

我正在开发一个使用 3D 形状的学校程序,我需要弄清楚如何制作一个实心立方体。当我制作立方体时,我最终得到了这个:

我注意到它正在按照我定义它们的顺序绘制形状。然后我试图找到这个问题的解决方案,因为我确信很多其他人也有类似的问题,我遇到了一种叫做面部剔除的东西,它所有的面部点都是逆时针定义的,所以当它被渲染时,它会被绘制顺时针方向,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()

【问题讨论】:

  • 为什么不使用glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE);
  • 正如@Spektre 所说,这与其说是面部剔除问题,不如说是深度测试问题。也许这是想要的结果,但是如果没有深度测试,您的面将按照您定义它们的顺序绘制,如果您有 2 个立方体,那么后面的立方体可能会呈现在前面的上面。
  • @florentteppe 深度测试已启用 (glEnable(GL_DEPTH_TEST))。图片与代码不符!
  • @Rabbid76 除非使用了错误的文本功能和清晰的深度值组合...
  • @Rabbid76 嘿,另一个错字应该是深度测试函数而不是文本:)

标签: python python-3.x opengl pygame pyopengl


【解决方案1】:

在调用任何OpenGL指令之前,已经设置了(OpenGL)显示模式,否则不会起任何作用,甚至会报错:

pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

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)

如果这样做,Depth Test 将起作用并且网格被正确绘制。


顺便说一句,并非所有的面都是按逆时针缠绕顺序绘制的。它必须是:

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()

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 2011-01-17
    • 2014-07-18
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2020-07-02
    • 2020-06-28
    相关资源
    最近更新 更多