PyOpenGL 多边形透视颜色
PyOpenGL Polygon See Through Colors
我对 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()
它只是显示了一个带有彩色面的简单立方体。
颜色不是纯色,您可以看穿它们。
我应该怎么做才能解决这个问题?
如有任何帮助,我们将不胜感激。
我从你注释掉的部分可以看出你可能怀疑你的四边形的缠绕顺序是罪魁祸首,但这不是这里的实际问题。然而,将缠绕顺序与背面剔除结合使用仍然是一个很好的做法,可以减少显卡必须执行的不必要的工作。 (所有值均为默认值,您的第二组注释曲面是正确的,除了您仍然需要翻转的最后一个曲面。)
这里真正的问题是您需要先启用功能——即使是您凭直觉认为存在的非常基本的功能——然后才能使用它们。在 set_mode()
之后放这个:
glEnable(GL_DEPTH_TEST)
否则,图元只是按照它们进入的顺序绘制,而无需查看深度缓冲区(它只是被忽略了)。因此,由于稍后渲染,一些实际位于其他人后面的面和一些线会意外地绘制在它们之上。
请注意,您还应该启用背面剔除(在注释第一组表面并取消注释第二组表面之后),因为默认情况下不会使用它:
glEnable(GL_CULL_FACE)
另请注意,如果您没有线条(您可以通过注释掉您的那部分代码来尝试),则严格来说并不需要进行深度测试,因为立方体是凸形并且背面剔除一个人就可以解决问题(这显然不适用于凹形或复杂场景)。
我对 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()
它只是显示了一个带有彩色面的简单立方体。 颜色不是纯色,您可以看穿它们。 我应该怎么做才能解决这个问题?
如有任何帮助,我们将不胜感激。
我从你注释掉的部分可以看出你可能怀疑你的四边形的缠绕顺序是罪魁祸首,但这不是这里的实际问题。然而,将缠绕顺序与背面剔除结合使用仍然是一个很好的做法,可以减少显卡必须执行的不必要的工作。 (所有值均为默认值,您的第二组注释曲面是正确的,除了您仍然需要翻转的最后一个曲面。)
这里真正的问题是您需要先启用功能——即使是您凭直觉认为存在的非常基本的功能——然后才能使用它们。在 set_mode()
之后放这个:
glEnable(GL_DEPTH_TEST)
否则,图元只是按照它们进入的顺序绘制,而无需查看深度缓冲区(它只是被忽略了)。因此,由于稍后渲染,一些实际位于其他人后面的面和一些线会意外地绘制在它们之上。
请注意,您还应该启用背面剔除(在注释第一组表面并取消注释第二组表面之后),因为默认情况下不会使用它:
glEnable(GL_CULL_FACE)
另请注意,如果您没有线条(您可以通过注释掉您的那部分代码来尝试),则严格来说并不需要进行深度测试,因为立方体是凸形并且背面剔除一个人就可以解决问题(这显然不适用于凹形或复杂场景)。