python - Autodesk Maya api - 导入几何体

标签 python api maya mel

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

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

如有任何帮助,我们将不胜感激。

标记

最佳答案

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

  1. OpenMaya 1.0
  2. OpenMaya 2.0

其中 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 中,因此无法使用传统的撤消方法撤消它。要将其变成具有撤消支持的成熟操作,您需要将此功能作为 MPXCommand 的一部分。 。正如您所看到的,从 Python 使用 1.0 OpenMaya API 有点麻烦,因为它涉及为 Python 本身不支持的 C++ 数据类型创建代理,因此如果您不熟悉这两种语言和 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 路径。

关于python - Autodesk Maya api - 导入几何体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26845134/

相关文章:

python - 使用 np.savetxt 将数组保存为列

java - Python和java在处理apache beam框架时有什么区别?

php - 缓存 API/接口(interface)以用作模型

node.js - 使用 Auth0 在 Node 中进行无密码身份验证

python - 使用 pyside/pyqt 更改 QPixmap 的饱和度

python - 运行 python 脚本时,守护线程在 ipython 中保持事件状态

python - PySide QGLBuffer 分配输入数据

c - __u8 __s16 等的新版本

python - Maya – 为什么在清除历史命令后无法执行打印方法?

c# - 按偏移量/矢量移动每个 UV 顶点