嗨,我试图在Maya中创建一个API来加载自定义文件格式,然后读取数据来创建顶点。
我的总体目标是从文件中的数据创建顶点,然后转换为多边形。
任何帮助都将不胜感激。
标记
发布于 2014-11-10 19:52:39
通常,当人们在maya中谈论" API“时,他们指的是OpenMaya,它是Maya向插件开发人员公开的C++ API的一个Python包装器。在最近的玛雅人中,实际上有两种版本:
在2.0版本更多的是‘琵琶’,但也不太成熟和不充分的功能。这两个都包含在任何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的一部分。如您所见,使用Python1.0的OpenMaya API有点麻烦,因为它涉及为C++数据类型创建代理,而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路由。
https://stackoverflow.com/questions/26845134
复制相似问题