Я работаю над программой для школы, которая использует трехмерные фигуры, и мне нужно выяснить, как сделать сплошной куб. Когда я делаю куб, я получаю следующее:
Я заметил, что рисует фигуры в порядке, в котором я их определил. Затем я попытался найти решение этой проблемы, потому что уверен, что у многих других людей есть подобная проблема, и я сталкиваюсь с так называемым отбраковкой лица, в которой все точки граней определяются против часовой стрелки при обращении наружу, поэтому при визуализации он будет нарисован. по часовой стрелке и opengl может заметить это и не рисовать их.
Я попытался использовать это, и все равно получилось с тем же результатом, поэтому я хочу, чтобы кто-то сказал мне, если я делаю это неправильно или мне нужно использовать другой метод. Вот мой код, это, вероятно, беспорядок, потому что весь этот 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()