Autodesk Maya api - 导入几何体

时间:2014-11-10 13:37:36

标签: python api maya mel

您好我正在尝试在Maya中创建一个API来加载自定义文件格式,然后读取数据以创建顶点。

我的总体目标是从文件中的数据创建顶点,然后转换为多边形。

任何帮助都将不胜感激。

马克

1 个答案:

答案 0 :(得分:3)

通常当人们在maya中谈论“API”时,他们指的是OpenMaya,它是Maya向插件开发人员公开的C ++ API的Python包装器。在最近的Mayas中实际上有两个版本:

  1. OpenMaya 1.0
  2. OpenMaya 2.0
  3. 其中2.0版本更“pythonic”,但也不太成熟,功能不全。这些都包含在任何Maya安装中 - 您可以使用Maya脚本侦听器中的标准python导入来访问它们。

    对于您所描述的问题,您可以像这样使用API​​:

    def create(verts, faces, merge=True):
        '''
        Given a list of vertices (iterables of floats) and a list of faces (iterable of integer vert indices),
        creates and returns a maya Mesh
        '''
    
        cmds.select(cl=True)  
        outputMesh = OpenMaya.MObject()
    
        numFaces = len(faces)
        numVertices = len(verts)
    
        # point array of plane vertex local positions
        points = OpenMaya.MFloatPointArray()
        for eachVt in verts:
            p = OpenMaya.MFloatPoint(eachVt[0], eachVt[1], eachVt[2])
            points.append(p)
    
        # vertex connections per poly face in one array of indexs into point array given above
        faceConnects = OpenMaya.MIntArray()
        for eachFace in faces:
            for eachCorner in eachFace:
                faceConnects.append(eachCorner)
    
        # an array to hold the total number of vertices that each face has
        faceCounts = OpenMaya.MIntArray()
        for c in range(0, numFaces, 1):
            faceCounts.append(3)
    
        # create mesh object using arrays above and get name of new mesh
        meshFS = OpenMaya.MFnMesh()
        newMesh = meshFS.create(numVertices, numFaces, points, faceCounts, faceConnects, outputMesh)
        nodeName = meshFS.name()
        cmds.sets(nodeName, add='initialShadingGroup')  
        cmds.select(nodeName)  
        meshFS.updateSurface()
        # this is useful because it deletes stray vertices (ie, those not used in any faces)
        if merge:
            cmds.polyMergeVertex(nodeName, ch=0)
        meshFS.updateSurface()
        return nodeName
    

    但是,此示例直接从python调用API而不将其包装在API命令shell中,因此无法使用常规撤消方法撤消API。要使用撤消支持将其转换为完整的操作,您需要将此功能作为MPXCommand的一部分。正如您所看到的,使用Python的1.0 OpenMaya API有点麻烦,因为它涉及为C ++数据类型创建代理,Python本身不支持这些代理,因此如果您不熟悉这两种语言和Maya,它可能会非常复杂。我没有足够的2.0 API经验来了解它是否是一项重大改进,但是在街上说它还不是很完整。

    如果您不担心速度,可以使用常规maya.cmds模块使用艺术家用来手工制作几何体的相同功能来创建几何体。这是一个简单的例子:

    verts = [(0,0,0), (0,1,0), (1,0,0), (1,1,1)]
    faces = [(0,1,2),(1,2,3)]
    
    def create_geometry(verts, faces):    
       cmds.constructionHistory(tgl = 'off')
       results = []
       for f in faces:
           points = [verts[i] for i in f]
           results += cmds.polyCreateFacet( p = points, ch = 0)
       cmds.polyUnite(results, ch=0)
       cmds.polyMergeVertex(d=0, ch=0)
       cmds.constructionHistory(tgl = 'on')
    
    
    create_geometry(verts, faces)
    

    正如您所看到的,此方法编写起来非常简单,但速度也慢得多。适合您的方式取决于您的需求。如果你可以只发布一个python脚本,第二种方法就更容易了。如果要创建一个创建完整的maya文件转换器或新MEL命令的传统插件,则必须使用MPXCommand路径。