簡體   English   中英

為什么我的深度測試在 PyOpenGL 中不起作用

[英]Why is my depth testing not working in PyOpenGL

我對 3D 圖形很陌生,所以我只是在學習:-D。 我想創建一個立方體作為我的第一個項目。 我選擇了 PyOpenGl 並遇到了以下問題:深度測試對我不起作用。 我在互聯網上搜索了教程,但沒有任何幫助我找到代碼中的錯誤。 誰能給我建議? 這是我的代碼:

import glfw
import math
from OpenGL.GL import *


glfw.init()

window = glfw.create_window(800, 600, "First Project", None, None)
glfw.set_window_pos(window, 400, 200)
glfw.make_context_current(window)

glEnableClientState(GL_VERTEX_ARRAY)

angle = 0.0005

cube = [
    [-0.5,  0.5, 0],
    [ 0.5,  0.5, 0],
    [ 0.5,  -0.5, 0],
    [-0.5, -0.5, 0],

    [-0.5,  0.5, -1],
    [ 0.5,  0.5, -1],
    [ 0.5,  -0.5, -1],
    [-0.5, -0.5, -1]
]

def RotateMatrix3DAroundX(x, y, z, angle):
    Rx = 1 * x + 0 * y + 0 * z
    Ry = 0 * x + math.cos(angle) * y + (-math.sin(angle) * z)
    Rz = 0 * x + math.sin(angle) * y + math.cos(angle) * z

    return [Rx, Ry, Rz]

def Drawing():

    glBegin(GL_QUADS)

    glColor3f(255, 0, 0)
    glVertex3f(cube[0][0], cube[0][1], cube[0][2])
    glVertex3f(cube[1][0], cube[1][1], cube[1][2])

    glVertex3f(cube[1][0], cube[1][1], cube[1][2])
    glVertex3f(cube[2][0], cube[2][1], cube[2][2])

    glVertex3f(cube[2][0], cube[2][1], cube[2][2])
    glVertex3f(cube[3][0], cube[3][1], cube[3][2])

    glVertex3f(cube[3][0], cube[3][1], cube[3][2])
    glVertex3f(cube[0][0], cube[0][1], cube[0][2])


    glColor3f(0, 255, 0)
    glVertex3f(cube[4][0], cube[4][1], cube[4][2])
    glVertex3f(cube[5][0], cube[5][1], cube[5][2])

    glVertex3f(cube[5][0], cube[5][1], cube[5][2])
    glVertex3f(cube[6][0], cube[6][1], cube[6][2])

    glVertex3f(cube[6][0], cube[6][1], cube[6][2])
    glVertex3f(cube[7][0], cube[7][1], cube[7][2])

    glVertex3f(cube[7][0], cube[7][1], cube[7][2])
    glVertex3f(cube[4][0], cube[4][1], cube[4][2])


    glColor3f(0, 0, 255)
    glVertex3f(cube[0][0], cube[0][1], cube[0][2])
    glVertex3f(cube[4][0], cube[4][1], cube[4][2])

    glVertex3f(cube[4][0], cube[4][1], cube[4][2])
    glVertex3f(cube[7][0], cube[7][1], cube[7][2])

    glVertex3f(cube[7][0], cube[7][1], cube[7][2])
    glVertex3f(cube[3][0], cube[3][1], cube[3][2])

    glVertex3f(cube[3][0], cube[3][1], cube[3][2])
    glVertex3f(cube[0][0], cube[0][1], cube[0][2])

    glColor3f(150, 150, 150)
    glVertex3f(cube[0][0], cube[0][1], cube[0][2])
    glVertex3f(cube[4][0], cube[4][1], cube[4][2])

    glVertex3f(cube[4][0], cube[4][1], cube[4][2])
    glVertex3f(cube[5][0], cube[5][1], cube[5][2])

    glVertex3f(cube[5][0], cube[5][1], cube[5][2])
    glVertex3f(cube[1][0], cube[1][1], cube[1][2])

    glVertex3f(cube[1][0], cube[1][1], cube[1][2])
    glVertex3f(cube[0][0], cube[0][1], cube[0][2])

    glColor3f(150, 0, 150)
    glVertex3f(cube[1][0], cube[1][1], cube[1][2])
    glVertex3f(cube[5][0], cube[5][1], cube[5][2])

    glVertex3f(cube[5][0], cube[5][1], cube[5][2])
    glVertex3f(cube[6][0], cube[6][1], cube[6][2])

    glVertex3f(cube[6][0], cube[6][1], cube[6][2])
    glVertex3f(cube[2][0], cube[2][1], cube[2][2])

    glVertex3f(cube[2][0], cube[2][1], cube[2][2])
    glVertex3f(cube[1][0], cube[1][1], cube[1][2])

    glColor3f(150, 150, 0)
    glVertex3f(cube[3][0], cube[3][1], cube[3][2])
    glVertex3f(cube[7][0], cube[7][1], cube[7][2])

    glVertex3f(cube[7][0], cube[7][1], cube[7][2])
    glVertex3f(cube[6][0], cube[6][1], cube[6][2])

    glVertex3f(cube[6][0], cube[6][1], cube[6][2])
    glVertex3f(cube[2][0], cube[2][1], cube[2][2])

    glVertex3f(cube[2][0], cube[2][1], cube[2][2])
    glVertex3f(cube[3][0], cube[3][1], cube[3][2])
    glEnd()

    for i in range(8):
        cube[i] = RotateMatrix3DAroundX(cube[i][0], cube[i][1], cube[i][2], angle)

while not(glfw.window_should_close(window)):

    glfw.poll_events()
    glClearColor(0, 0, 0, 0)
    glEnable(GL_DEPTH_TEST)
    glDepthFunc(GL_LESS)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    Drawing()

    glfw.swap_buffers(window)

glfw.terminate()

這是我得到的結果圖像: image_of_my_result

立方體的一部分被查看體積的近平面和遠平面剪裁。 設置到近平面和遠平面距離較大的正交投影

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-1, 1, -1, 1, -2, 2)
glMatrixMode(GL_MODELVIEW)

while not(glfw.window_should_close(window)):
    # [...]

不要改變立方體頂點,而是使用旋轉矩陣:

def Drawing():
    # [...]

    glRotate(math.degrees(angle), 1, 0, 0)

    # DELETE
    #for i in range(8):
    #    cube[i] = RotateMatrix3DAroundX(cube[i][0], cube[i][1], cube[i][2], angle)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM