我遇到PyOpenGL问题。 这是我的代码:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
from math import *
a=[[cos(0.5*pi/180),sin(0.5*pi/180),0],
[-sin(0.5*pi/180),cos(0.5*pi/180),0],
[0,0,1]]
def zarb_matris(p,b):
c=[b[0][0]*p[0][0]+b[0][1]*p[1][0]+b[0][2]*p[2][0],
b[1][0]*p[0][0]+b[1][1]*p[1][0]+b[1][2]*p[2][0],
b[2][0]*p[0][0]+b[2][1]*p[1][0]+b[2][2]*p[2][0]]
return c
verticies= [
[1, -1, -1],
[1, 1, -1],
[-1, 1, -1],
[-1, -1, -1],
[1, -1, 1],
[1, 1, 1],
[-1, -1, 1],
[-1, 1, 1]
]
edges = (
(0,1),
(0,3),
(0,4),
(2,1),
(2,3),
(2,7),
(6,3),
(6,4),
(6,7),
(5,1),
(5,4),
(5,7),
)
surfaces= (
(0,1,2,3),
(3,2,7,6),
(6,7,5,4),
(4,5,1,0),
(1,5,7,2),
(4,0,3,6)
)
## (0,3,2,1),
## (6,7,2,3),
## (4,5,7,6),
## (4,0,1,5),
## (5,1,2,7),
## (4,0,3,6)
## )
colors = (
(0.9,0,0),#red
(0,1,0),#green
(0.75,0.38,0),#orange
(0,0,1),#blue
(1,1,0),#yellow
(1,1,1),
(1,0,0),
(0,1,0),
(0.75,0.38,0),
(0,0,1),
(1,1,0),
(0.9,1,1)
)
def Cube():
global verticies
glBegin(GL_QUADS)
x = 0
for surface in surfaces:
x+=1
for vertex in surface:
glColor3fv(colors[x])
glVertex3fv(verticies[vertex])
glEnd()
glBegin(GL_LINES)
glColor3fv((1,1,1))
for edge in edges:
for vertex in edge:
glVertex3fv(verticies[vertex])
glEnd()
def main():
global s
pygame.init()
display = (800,600)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
glTranslatef(1,1, -10)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
glRotatef(1, 12, 1, 1)
for i in range(8):
s=[]
for j in verticies[i]:
s.append([j])
k=zarb_matris(s,a)
verticies[i]=k
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
Cube()
pygame.display.flip()
pygame.time.wait(10)
main()
它只显示一个带有彩色面的简单立方体。 颜色不牢固,你可以透过它们看到。 我该怎么做才能解决这个问题?
非常感谢任何帮助。
答案 0 :(得分:0)
从你评论的部分我可以看出你可能怀疑你的四边形的缠绕顺序是罪魁祸首,但这不是实际的问题。然而,使用缠绕顺序和背面剔除仍然是一种很好的做法,以减少图形卡必须执行的不必要的工作。 (如果所有值都是默认值,则除了最后一个仍然需要转动的曲面外,您的第二个注释曲面集是正确的曲面。)
这里真正的问题是你需要在使用之前启用功能 - 即使是非常基本的功能 - 你直觉地认为它们在那里。在set_mode()
之后:
glEnable(GL_DEPTH_TEST)
如果没有这个原语,基元就会按照它们进入的顺序绘制,而不需要查看深度缓冲区(它只是被忽略)。因此,一些面孔和一些实际位于其他面孔后面的线条将会意外地被绘制在它们之上,因为它们将在稍后渲染。
请注意,您还应该启用背面剔除(在评论第一组并取消注释第二组曲面后),因为它默认情况下不会被使用:
glEnable(GL_CULL_FACE)
另请注意,如果您没有线(您可以尝试通过注释掉那部分代码),则不会严格要求深度测试,因为立方体是凸形的并且背面单独剔除就可以解决这个问题(显然,这对于凹形或复杂场景不起作用)。