首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autodesk Maya api -导入几何学

Autodesk Maya api -导入几何学
EN

Stack Overflow用户
提问于 2014-11-10 13:37:36
回答 1查看 1.5K关注 0票数 1

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

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

任何帮助都将不胜感激。

标记

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-10 19:52:39

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

  1. OpenMaya 1.0
  2. OpenMaya 2.0

在2.0版本更多的是‘琵琶’,但也不太成熟和不充分的功能。这两个都包含在任何Maya安装中--您可以通过从Maya脚本侦听器导入标准python来访问它们。

对于您所描述的问题,可以使用API,如下所示:

代码语言:javascript
复制
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命令外壳中,因此不能使用常规的撤销方法来撤消它。要将其转化为具有撤消支持的完整操作,您需要将此函数作为MPXCommand的一部分。如您所见,使用Python1.0的OpenMaya API有点麻烦,因为它涉及为C++数据类型创建代理,而Python本机不支持这些代理,因此如果您不熟悉C++的语言和Maya,它可能会非常复杂。我对2.0 API没有足够的经验来知道它是否是一个重大的改进,但流言说它还不是很完整。

如果您不担心速度,您只需使用常规的maya.cmds模块来创建几何学,使用艺术家用来手工制作几何图形的函数。下面是一个简单的例子:

代码语言:javascript
复制
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路由。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26845134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档