Pyopengl читает файл obj

Я попытался прочитать файл obj с помощью pyopengl, но ошибка возникла из-за glGenList (1) Я просто хочу прочитать файл и отобразить его в opengl. Пожалуйста, помогите мне с полным кодом;

Я устал от стека и ошибки, мне потребовалось 3 часа, чтобы опубликовать это из OpenGL.GL import * from tkinter import messagebox import sys

filename = input('pls input file path: ')


class OBJ:
    def __init__(self, filename, swapyz=False):
    """Loads a Wavefront OBJ file. """
    self.vertices = []
    self.normals = []
    self.texcoords = []
    self.faces = []

    material = None
    for line in open(filename, "r"):
        if line.startswith('#'): continue
        values = line.split()
        #print(values)
        if not values: continue
        if values[0] == 'v':
            v = list(map(float, values[1:4]))
            if swapyz:
                v = (v[0], v[2], v[1])
            self.vertices.append(v)
        elif values[0] == 'vn':
            v = list(map(float, values[1:4]))
            if swapyz:
                v = (v[0], v[2], v[1])
            self.normals.append(v)
        elif values[0] == 'vt':
            self.texcoords.append(map(float, values[1:3]))
        elif values[0] == 'mtllib':
            continue
        elif values[0] == 'f':
            face = []
            texcoords = []
            norms = []
            for v in values[1:]:
                w = v.split('/')
                face.append(int(w[0]))
                if len(w) >= 2 and len(w[1]) > 0:
                    texcoords.append(int(w[1]))
                else:
                    texcoords.append(0)
                if len(w) >= 3 and len(w[2]) > 0:
                    norms.append(int(w[2]))
                else:
                    norms.append(0)
            self.faces.append((face, norms, texcoords))
            #print(self.faces)

    self.gl_list = glGenLists(0)
    glNewList(self.gl_list, GL_COMPILE)
    #glEnable(GL_TEXTURE_2D)
    #glFrontFace(GL_CCW)
    for face in self.faces:
        vertices, normals, texture_coords = face


        glBegin(GL_POLYGON)
        for i in range(len(vertices)):
            if normals[i] > 0:
                glNormal3fv(self.normals[normals[i] - 1])
            if texture_coords[i] > 0:
                glTexCoord2fv(self.texcoords[texture_coords[i] - 1])
             glVertex3fv(self.vertices[vertices[i] - 1])
        glEnd()
    glEndList() 
OBJ(filename,swapyz=True)

person Lord_daniel    schedule 28.06.2020    source источник


Ответы (1)


Для любой инструкции OpenGL требуется действующий и текущий контекст OpenGL. Перед созданием списка отображения убедитесь, что вы создали окно OpenGL.


Существует вторая проблема, которая вызовет ошибку при вызове glNewList после того, как первая проблема будет решена. Вы хотите создать более одного объекта списков отображения, поэтому аргумент _2 _ должно быть не менее 1:

self.gl_list = glGenLists(0)

self.gl_list = glGenLists(1)
person Rabbid76    schedule 28.06.2020
comment
@Lord_daniel Понятно. В любом случае вы только что выбрали одну часть ответа. Вы должны прочитать первое предложение ответа. Не игнорируйте это! - person Rabbid76; 28.06.2020
comment
Да, братан, я попробую это и дам ответ как можно скорее - person Lord_daniel; 29.06.2020