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

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 Ubuntu系统配置PX4
  • ¥20 MATLAB间接平差计算
  • ¥50 nw.js调用activex
  • ¥15 数据库获取信息反馈出错,直接查询了ref字段并且还使用了User文档的_id而不是自己的
  • ¥15 将安全信息用到以下对象时发生以下错误:c:dumpstack.log.tmp 另一个程序正在使用此文件,因此无法访问
  • ¥15 速度位置规划实现精确定位的问题
  • ¥15 MAC虚拟机(win11)USB插上后无串口com,无法烧录
  • ¥15 代码问题:df = pd.read_excel('c:\User\18343\Desktop\wpsdata.xlxs')路径读不到
  • ¥50 基于ubuntu的Mamba配置环境失败问题
  • ¥15 为什么视频算法现在全是动作识别?