勤勉苦学xvv 2021-03-10 19:25 采纳率: 100%
浏览 296
已采纳

python中处理mesh模型的库以及工具

python中有什么好用的工具用来处理mesh模型?

如何把一个平面(立方体的一个面)转换为mesh格式,工具是否能实现

  • 写回答

1条回答 默认 最新

  • Brentbin 2021-03-11 15:38
    关注

    首先Mesh文件为unity平台独有的文件类型,用以描述模型

    unity本身对外开放性并不那么友好,所以一些中间平台会比较好

    https://gist.github.com/MattRix/0522c27ee44c0fbbdf76d65de123eeff

    这里是把Mesh从unity3D导出到OBJ文件的指南

    然后python有大量的库可以处理OBJ文件

    比如OpenGL

    https://stackoverflow.com/questions/59923419/pyopengl-how-do-i-import-an-obj-file

    这里有个教程

    以防打不开stack overflow,这里贴下代码

    import pygame
    import OpenGL
    from pygame.locals import *
    from OpenGL.GL import *
    from OpenGL.GLU import *
    import pywavefront
    
    scene = pywavefront.Wavefront('bunny.obj', collect_faces=True)
    
    scene_box = (scene.vertices[0], scene.vertices[0])
    for vertex in scene.vertices:
        min_v = [min(scene_box[0][i], vertex[i]) for i in range(3)]
        max_v = [max(scene_box[1][i], vertex[i]) for i in range(3)]
        scene_box = (min_v, max_v)
    
    scene_size     = [scene_box[1][i]-scene_box[0][i] for i in range(3)]
    max_scene_size = max(scene_size)
    scaled_size    = 5
    scene_scale    = [scaled_size/max_scene_size for i in range(3)]
    scene_trans    = [-(scene_box[1][i]+scene_box[0][i])/2 for i in range(3)]
    
    def Model():
        glPushMatrix()
        glScalef(*scene_scale)
        glTranslatef(*scene_trans)
    
        for mesh in scene.mesh_list:
            glBegin(GL_TRIANGLES)
            for face in mesh.faces:
                for vertex_i in face:
                    glVertex3f(*scene.vertices[vertex_i])
            glEnd()
    
        glPopMatrix()
    
    def main():
            pygame.init()
            display = (800, 600)
            pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
            gluPerspective(45, (display[0] / display[1]), 1, 500.0)
            glTranslatef(0.0, 0.0, -10)
    
            while True:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        pygame.quit()
                        quit()
    
                    if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_LEFT:
                            glTranslatef(-0.5,0,0)
                        if event.key == pygame.K_RIGHT:
                            glTranslatef(0.5,0,0)
                        if event.key == pygame.K_UP:
                            glTranslatef(0,1,0)
                        if event.key == pygame.K_DOWN:
                            glTranslatef(0,-1,0)
    
                glRotatef(1, 5, 1, 1)
                glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    
                glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
                Model()
                glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
    
                pygame.display.flip()
                pygame.time.wait(10)
    
    main()
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么