[Python] Why is my openGL render failing, Python OpenGL

Discussão em 'Python' iniciado por Stack, Março 27, 2025.

  1. Stack

    Stack Membro Participativo

    Im using visual studio code to render a game using python, pygame and openGL:

    import pygame
    from pygame.locals import *
    from OpenGL.GL import *
    from OpenGL.GLU import *
    import numpy

    class ObjLoader:
    def __init__(self, filename):
    self.vertices = []
    self.faces = []
    self.texture_coords = []
    self.normals = []
    self.texture_id = None

    self.load_model(filename)

    def load_model(self, filename):
    with open(filename, 'r') as f:
    for line in f:
    if line.startswith('v '):
    #vertex coordinates
    coords = line.split()[1:]
    self.vertices.append([float(coord) for coord in coords])
    elif line.startswith('vt '):
    #texture coordinates
    coords = line.split()[1:]
    self.texture_coords.append([float(coord) for coord in coords])
    elif line.startswith('vn '):
    #normal vectors
    coords = line.split()[1:]
    self.normals.append([float(coord) for coord in coords])
    elif line.startswith('f '):
    #face indices
    face = line.split()[1:]
    face = [[int(v.split('/')[0]) - 1,
    int(v.split('/')[1]) - 1,
    int(v.split('/')[2]) - 1] for v in face]
    self.faces.append(face)

    def load_texture(self, texture_filename):
    self.texture_id = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, self.texture_id)

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

    image = pygame.image.load(texture_filename).convert_alpha()
    image_width, image_height = image.get_rect().size
    image_data = pygame.image.tostring(image, "RGBA", 1)

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height,
    0, GL_RGBA, GL_UNSIGNED_BYTE, image_data)
    glGenerateMipmap(GL_TEXTURE_2D)

    def render(self):
    glActiveTexture(GL_TEXTURE0)
    glBindTexture(GL_TEXTURE_2D, self.texture_id)


    glBegin(GL_TRIANGLES)
    for face in self.faces:
    for i in range(3):
    vertex_index = face[0]
    texture_coord_index = face[1]
    normal_index = face[2]

    glTexCoord2f(*self.texture_coords[texture_coord_index])
    glNormal3f(*self.normals[normal_index])
    glVertex3f(*self.vertices[vertex_index])
    glEnd()

    if self.texture_id:
    glDisable(GL_TEXTURE_2D)

    class Board(ObjLoader):
    def __init__(self, filename):
    super().__init__(filename)

    class ShogiWindow:
    def __init__(self):
    pygame.init()
    self.display = (800, 600)
    self.screen = pygame.display.set_mode(self.display, DOUBLEBUF|OPENGL)

    self.board = Board('object_reasoures/shogiBoard.obj')
    self.board.load_texture('photos/shogiDefaultTexture.png')
    self.setup_scene()

    def setup_scene(self):
    gluPerspective(45, (self.display[0]/self.display[1]), 0.1, 45.0)
    vertices = numpy.array(self.board.vertices)
    x_center = numpy.mean(vertices[:, 0])
    y_center = numpy.mean(vertices[:, 1])
    z_center = numpy.mean(vertices[:, 2])

    gluLookAt(x_center, y_center + 1, -1, # Camera position
    x_center, y_center, z_center, # Look at point
    0, 1, 0) # Up vector

    def run(self):
    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)
    self.board.render()
    pygame.display.flip()
    pygame.time.wait(10)

    if __name__ == '__main__':
    window = ShogiWindow()
    window.run()


    ...but when the object was exported the image produced is an error:

    [​IMG]

    I just expected a simple box rendered from above.

    The file locations are correct and the object with the texture had loaded correctly in blender.

    Continue reading...

Compartilhe esta Página