微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 pyopengl 中添加图像作为 3D 立方体的纹理

如何解决如何在 pyopengl 中添加图像作为 3D 立方体的纹理

如何在我的立方体中添加图像作为纹理: 我想添加我自己提供的图像作为立方体的表面,同时仍然有一些照明

我使用 Visual Studio Code 作为编译器

这是我复制的代码

    import pygame
    from pygame.locals import *

    from OpenGL.GL import *
    from OpenGL.glu import *

    verticies = (
( 1,-1,-1),# 0
( 1,1,# 1
(-1,# 2
(-1,# 3
( 1,1),# 4
( 1,# 5
(-1,# 6
(-1,# 7
)

    surfaces = (
(0,2,3),(3,7,6),(6,5,4),(4,0),(1,2),3,)

    normals = [
( 0,# surface 0
(-1,# surface 1
( 0,# surface 2
( 1,# surface 3
( 0,# surface 4
( 0,0)   # surface 5
    ]

    colors = (
(1,(0,)

    edges = (
(0,(2,7),(5,)


    def Cube():
        glBegin(GL_QUADS)
        for i_surface,surface in enumerate(surfaces):
            x = 0
            glnormal3fv(normals[i_surface])
            for vertex in surface:
                x+=1
                glColor3fv(colors[x])
                glVertex3fv(verticies[vertex])
        glEnd()

        glColor3fv(colors[0])
        glBegin(GL_LInes)
        for edge in edges:
            for vertex in edge:
                glVertex3fv(verticies[vertex])
        glEnd()


    def main():
        global surfaces

        pygame.init()
        display = (800,600)
        pygame.display.set_mode(display,DOUBLEBUF|OPENGL)
        clock = pygame.time.Clock()

        glMatrixMode(GL_PROJECTION)
        gluPerspective(45,(display[0]/display[1]),0.1,50.0)

        glMatrixMode(GL_MODELVIEW)
        glTranslatef(0,-5)

        #glLight(GL_LIGHT0,GL_POSITION,0)) # directional light from the front
        glLight(GL_LIGHT0,1)) # point light from the left,top,front
        glLightfv(GL_LIGHT0,GL_AMBIENT,1))
        glLightfv(GL_LIGHT0,GL_DIFFUSE,1))

        glEnable(GL_DEPTH_TEST) 

        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)

            glEnable(GL_LIGHTING)
            glEnable(GL_LIGHT0)
            glEnable(GL_COLOR_MATERIAL)
            glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE )

            glrotatef(1,1)
            Cube()

            gldisable(GL_LIGHT0)
            gldisable(GL_LIGHTING)
            gldisable(GL_COLOR_MATERIAL)

            pygame.display.flip()
            clock.tick(60)

    main()

程序显示一个旋转的立方体,表面只有颜色 我怎样才能改变表面?

解决方法

定义纹理坐标数组:

textureCoordinates = ((0,0),(0,1),(1,0))

设置白色,但在绘制立方体时指定纹理坐标:

def Cube():
    glColor3f(1,1,1)
    glBegin(GL_QUADS)
    for i_surface,surface in enumerate(surfaces):
        x = 0
        glNormal3fv(normals[i_surface])
        for i_vertex,vertex in enumerate(surface):
            x+=1
            #
            glTexCoord2fv(textureCoordinates[i_vertex])
            glVertex3fv(verticies[vertex])
    glEnd()

使用 pygame.image.load() 加载图像,创建纹理对象并在应用程序循环之前启用二维纹理:

def main():
    # [...]

    image = pygame.image.load('image.png')
    datas = pygame.image.tostring(image,'RGBA')
    texID = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D,texID)
    glTexImage2D(GL_TEXTURE_2D,GL_RGBA,image.get_width(),image.get_height(),GL_UNSIGNED_BYTE,datas)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)

    glEnable(GL_TEXTURE_2D)

    while True:
        # [...]

完整示例:

import pygame
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *

verticies = (
( 1,-1,-1),# 0
( 1,# 1
(-1,# 2
(-1,# 3
( 1,# 4
( 1,# 5
(-1,# 6
(-1,# 7
)

textureCoordinates = ((0,0))

surfaces = (
(0,2,3),(3,7,6),(6,5,4),(4,2),3,)

normals = [
( 0,# surface 0
(-1,# surface 1
( 0,# surface 2
( 1,# surface 3
( 0,# surface 4
( 0,0)   # surface 5
    ]

colors = (
(1,)

edges = (
(0,(2,7),(5,)


def Cube():
    glColor3f(1,vertex in enumerate(surface):
            x+=1
            #
            glTexCoord2fv(textureCoordinates[i_vertex])
            glVertex3fv(verticies[vertex])
    glEnd()

    glColor3fv(colors[0])
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(verticies[vertex])
    glEnd()


def main():
    global surfaces

    pygame.init()
    display = (400,300)
    pygame.display.set_mode(display,DOUBLEBUF|OPENGL)
    clock = pygame.time.Clock()

    glMatrixMode(GL_PROJECTION)
    gluPerspective(45,(display[0]/display[1]),0.1,50.0)

    glMatrixMode(GL_MODELVIEW)
    glTranslatef(0,-5)

    #glLight(GL_LIGHT0,GL_POSITION,0)) # directional light from the front
    glLight(GL_LIGHT0,1)) # point light from the left,top,front
    glLightfv(GL_LIGHT0,GL_AMBIENT,1))
    glLightfv(GL_LIGHT0,GL_DIFFUSE,1))

    glEnable(GL_DEPTH_TEST) 

    image = pygame.image.load('image.png')
    datas = pygame.image.tostring(image,GL_LINEAR)

    glEnable(GL_TEXTURE_2D)

    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)

        glEnable(GL_LIGHTING)
        glEnable(GL_LIGHT0)
        glEnable(GL_COLOR_MATERIAL)
        glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE )

        glRotatef(1,1)
        Cube()

        glDisable(GL_LIGHT0)
        glDisable(GL_LIGHTING)
        glDisable(GL_COLOR_MATERIAL)

        pygame.display.flip()
        clock.tick(60)

main()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。