Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用pygame和pyopengl正确添加灯光以使对象获得更好的视图_Python 3.x_Opengl_Pygame_Pyopengl_Opengl Compat - Fatal编程技术网

Python 3.x 如何使用pygame和pyopengl正确添加灯光以使对象获得更好的视图

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函数以插入一个简

我遵循的教程中,他教如何用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)