Python 3.x 如何使用pygame和pyopengl正确添加灯光以使对象获得更好的视图
我遵循的教程中,他教如何用pyOpenGL和pygame渲染立方体 渲染立方体时,教程将为立方体的所有顶点设置颜色,然后显示它。然而,在我的项目中,我使用中提供的代码从.obj文件加载对象,并且我的大多数对象都是完全白色的 结论:当我在屏幕上渲染它时,我只看到全白色,这很难看。所以我想用一盏灯来更好地观察这个物体,但我无法做到这一点 我对pyOpenGl知之甚少,也找不到更深入的教程 以下是教程中提供的部分代码和结果。(顶点、边、曲面和颜色变量是元组的元组) 我试图编辑main函数以插入一个简单的灯光,但立方体中的颜色消失了:Python 3.x 如何使用pygame和pyopengl正确添加灯光以使对象获得更好的视图,python-3.x,opengl,pygame,pyopengl,opengl-compat,Python 3.x,Opengl,Pygame,Pyopengl,Opengl Compat,我遵循的教程中,他教如何用pyOpenGL和pygame渲染立方体 渲染立方体时,教程将为立方体的所有顶点设置颜色,然后显示它。然而,在我的项目中,我使用中提供的代码从.obj文件加载对象,并且我的大多数对象都是完全白色的 结论:当我在屏幕上渲染它时,我只看到全白色,这很难看。所以我想用一盏灯来更好地观察这个物体,但我无法做到这一点 我对pyOpenGl知之甚少,也找不到更深入的教程 以下是教程中提供的部分代码和结果。(顶点、边、曲面和颜色变量是元组的元组) 我试图编辑main函数以插入一个简
def main():
pygame.init()
display = (800,600)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
glTranslatef(0.0,0.0, -5)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glRotatef(1, 3, 1, 1)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glPushMatrix()
glTranslatef(0.0,0.0, 5)
glLight(GL_LIGHT0, GL_POSITION, (0, 1, 0, 1))
glLightfv(GL_LIGHT0, GL_AMBIENT, (0, 1.5, 1, 0))
glPopMatrix()
Cube()
glDisable(GL_LIGHT0)
glDisable(GL_LIGHTING)
pygame.display.flip()
pygame.time.wait(10)
我想要的是有颜色的立方体,用灯光照射。我的代码有什么问题以及如何修复?启用照明()时,颜色取自材质参数()
如果仍要使用当前颜色,则必须启用
和设置颜色材质参数()
环境光不取决于光源的方向。您必须定义漫反射和/或镜面反射灯光。见:
当灯光位置设置为时,该位置将乘以当前模型视图矩阵。因此,必须在模型转换之前设置世界空间中的灯光位置。
在设置投影矩阵之前,切换到矩阵模式GL_投影
。否则,灯光位置将乘以投影矩阵
glMatrixMode(GL_投影)
透视图(45,(显示[0]/显示[1]),0.1,50.0)
glMatrixMode(GLU模型视图)
glTranslatef(0,0,-5)
#glLight(GL_灯0,GL_位置,(0,0,1,0))35;来自前方的平行光
glLight(GL_灯0,GL_位置,(5,5,5,1))#左、上、前的点光源
glLightfv(GL_LIGHT0,GL_环境光,(0,0,0,1))
glLightfv(GL_LIGHT0,GL_DIFFUSE,(1,1,1,1))
glEnable(GL_深度_测试)
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
退出
glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
glEnable(德国劳埃德大学照明)
glEnable(Glu LIGHT0)
glEnable(德国劳埃德船级社颜色材料)
glColorMaterial(GL_前部和后部、GL_环境和_漫反射)
glRotatef(1,3,1,1)
多维数据集()
glDisable(GL_LIGHT0)
glDisable(GLU照明)
glDisable(GL_颜色_材质)
pygame.display.flip()
漫反射(和镜面反射)灯光取决于曲面的矢量
定义法向量元组数组(x,y,z)
。注:以下定义是一个示例。因为你画了一个立方体,它有6个面,你必须定义6个法向量,但是向量的方向取决于你的顶点坐标,我不知道
法线=[
(0,0,-1),#曲面0
(-1,0,0),#表面1
(0,1,1),#表面2
(1,0,0),#表面3
(0,1,0),#表面4
(0,-1,0)#表面5
]
并在绘制对象时设置适当的法向量:
def Cube():
glBegin(GLU四边形)
对于i_曲面,枚举中的曲面(曲面):
x=0
GLNORMA3FV(法线[i_曲面])#设置曲面顶点的法向量
对于曲面中的顶点:
x+=1
glColor3fv(颜色[x])
glVertex3fv(垂直[顶点])
格伦德()
glColor3fv(颜色[0])
glBegin(GLU线)
对于边中的边:
对于边中的顶点:
glVertex3fv(垂直[顶点])
格伦德()
启用(glEnable(GL\u DEPTH\u TEST)
)以获得如下动画:
完整示例代码:
导入pygame
从pygame.locals导入*
从OpenGL.GL导入*
从OpenGL.GLU导入*
垂直度=(
( 1, -1, -1), # 0
( 1, 1, -1), # 1
(-1, 1, -1), # 2
(-1, -1, -1), # 3
( 1, -1, 1), # 4
( 1, 1, 1), # 5
(-1, -1, 1), # 6
(-1, 1, 1), # 7
)
表面=(
(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,0,-1),#曲面0
(-1,0,0),#表面1
(0,0,1),#表面2
(1,0,0),#表面3
(0,1,0),#表面4
(0,-1,0)#表面5
]
颜色=(
(1,1,1),
(0,1,0),
(0,0,1),
(0,1,0),
(0,0,1),
(1,0,1),
(0,1,0),
(1,0,1),
(0,1,0),
(0,0,1),
)
边=(
(0,1),
(0,3),
(0,4),
(2,1),
(2,3),
(2,7),
(6,3),
(6,4),
(6,7),
(5,1),
(5,4),
(5,7),
)
def Cube():
glBegin(GLU四边形)
对于i_曲面,枚举中的曲面(曲面):
x=0
glNormal3fv(法线[i_曲面])
对于曲面中的顶点:
x+=1
glColor3fv(颜色[x])
glVertex3fv(垂直[顶点])
格伦德()
glColor3fv(颜色[0])
glBegin(GLU线)
对于边中的边:
对于边中的顶点:
glVertex3fv(垂直[顶点])
格伦德()
def main():
全局曲面
pygame.init()
显示=(800600)
pygame.display.set_模式(显示,DOUBLEBUF | OPENGL)
clock=pygame.time.clock()
glMatrixMode(GL_投影)
透视图(45,(显示[0]/显示[1]),0.1,50.0)
glMatrixMode(GLU模型视图)
glTranslatef(0,0,-5)
#glLight(GL_灯0,GL_位置,(0,0,1,0))35;来自前方的平行光
glLight(GL_灯0,GL_位置,(5,5,5,1))#左、上、前的点光源
glLightfv(GL_LIGHT0,GL_环境光,(0,0,0,1))
glLightfv(GL_LIGHT0,GL_DIFFUSE,(1,1,1,1))
glEnable(GL_深度_测试)
尽管如此:
对于pygame.event.get()中的事件:
if event.typ
def main():
pygame.init()
display = (800,600)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
glTranslatef(0.0,0.0, -5)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glRotatef(1, 3, 1, 1)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glPushMatrix()
glTranslatef(0.0,0.0, 5)
glLight(GL_LIGHT0, GL_POSITION, (0, 1, 0, 1))
glLightfv(GL_LIGHT0, GL_AMBIENT, (0, 1.5, 1, 0))
glPopMatrix()
Cube()
glDisable(GL_LIGHT0)
glDisable(GL_LIGHTING)
pygame.display.flip()
pygame.time.wait(10)