从Assimp(Pyassimp)加载到pyglet错误结果

2024-05-15 12:08:26 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我正在使用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)

接下来的代码是draw事件:

^{pr2}$

最终结果是:

Not a cube


Tags: 端口代码selfnumpydatasceneopenglpyglet
1条回答
网友
1楼 · 发布于 2024-05-15 12:08:26

你必须在网格的面上循环,从那里读取顶点索引,然后绘制这些面。在

请参见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()

相关问题 更多 >