【发布时间】:2014-11-11 04:18:55
【问题描述】:
您好,我正在尝试在 Maya 中创建 API 以加载自定义文件格式,然后读取数据以创建顶点。
我的总体目标是从文件中的数据创建顶点,然后转换为多边形。
任何帮助将不胜感激。
标记
【问题讨论】:
您好,我正在尝试在 Maya 中创建 API 以加载自定义文件格式,然后读取数据以创建顶点。
我的总体目标是从文件中的数据创建顶点,然后转换为多边形。
任何帮助将不胜感激。
标记
【问题讨论】:
通常当人们在 Maya 中谈论“API”时,他们指的是 OpenMaya,这是 Maya 向插件开发人员公开的 C++ API 的 Python 包装器。在最近的玛雅人中实际上有两个版本:
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 命令外壳中,因此无法使用传统的撤消方法撤消它。要将其转换为具有撤消支持的完整操作,您需要将此功能作为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 路由。
【讨论】:
cmds.curve(p = your-list-of-points-here, d= curve-degree)。重新实现 DXF 导入器是一项重要的工作,因为 DXF 是一个古老而松散的标准......使用cmds.ls 或 API 可以轻松迭代导入的几何图形