从Assimp(Pyassimp)加载到pyglet - 结果不佳

时间:2017-05-01 21:35:40

标签: python opengl pyglet assimp

所以我正在使用pyglet学习OpenGL,我正在使用Assimp(端口:Pyassimp)从Blender导入一些模型。因此场景非常基本,它只是2个立方体,我将它以混合格式保存。在下一段代码中,我只是尝试使用其顶点位置绘制一个立方体,没有别的。

     self.scene = pyassimp.load(FILENAME, pyassimp.postprocess.aiProcess_Triangulate)  # Load the scene

    self.vertices = numpy.array((), dtype=GLfloat)
    for v in self.scene.meshes[1].vertices:
        self.vertices = numpy.append(self.vertices, v)

    self.vbo = pyglet.graphics.vertexbuffer.create_buffer(self.vertices.nbytes, GL_ARRAY_BUFFER, GL_STATIC_DRAW)
    glEnableVertexAttribArray(0)
    self.vbo.bind()
    self.vbo.set_data(self.vertices.ctypes.data)
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0)

下一段代码是绘制事件:

glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_COLOR_MATERIAL)

    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glLightfv(GL_LIGHT0, GL_POSITION, self.lightfv(1.0, 1.0, 1.0, 1.0))
    glLightfv(GL_LIGHT0, GL_AMBIENT, self.lightfv(0.0, 0.0, 0.0, 1.0))
    glLightfv(GL_LIGHT0, GL_DIFFUSE, self.lightfv(1.0, 1.0, 1.0, 1.0))
    glLightfv(GL_LIGHT0, GL_SPECULAR, self.lightfv(1.0, 1.0, 1.0, 1.0))


    glTranslated(0, 10, -25)
    glRotatef(self.rotation, 0, 1, 0)
    glDrawArrays(GL_TRIANGLES, 0, len(self.model.vertices))

最后结果:

Not a cube

1 个答案:

答案 0 :(得分:0)

你必须遍历网格的面,从那里读取顶点索引,然后绘制面。

参见assimp的C示例。它非常简单,显示了如何操作并且可以很容易地移植到python。 https://github.com/assimp/assimp/blob/master/samples/SimpleOpenGL/Sample_SimpleOpenGL.c

对于pyglet,您可以使用以下剪辑:

    for node in self.scene.rootnode.children:
        glPushMatrix()
        glMultMatrixf((GLfloat * 16)(*node.transformation.transpose().flatten()))

        for mesh in node.meshes:
            for face in mesh.faces:
                num_indices = len(face)
                if num_indices == 1:
                    mode = GL_POINTS
                elif num_indices == 2:
                    mode = GL_LINES
                elif num_indices == 3:
                    mode = GL_TRIANGLES
                else:
                    mode = GL_POLYGON

                pyglet.graphics.draw_indexed(len(mesh.vertices), mode, face, ('v3f', mesh.vertices.flatten()))

        glPopMatrix()
相关问题