maya python迭代了大量的顶点

时间:2016-03-05 00:16:41

标签: python maya symmetry maya-api

我在python中编写一个脚本,让maya将顶点位置从一侧交换到另一侧。 因为我希望翻转是基于拓扑的,所以我使用拓扑对称选择工具来找到顶点对应关系。 我设法使用filterExpand和xform来做到这一点。 问题是在大型多边形网格上它很慢,我想知道如何使用openMaya来完成这个。

将maya.cmds导入为cmds

def flipMesh():
    sel=cmds.ls(sl=1)
    axis={'x':0,'y':1,'z':2}
    reverse=[1.0,1.0,1.0]
    #quring the axtive symmetry axis
    activeaxis=cmds.symmetricModelling(q=1, axis=1)
    reverse[axis[activeaxis]]=-1.0
    #getting the vertex count
    verts=cmds.polyEvaluate(v=1)
    #selecting all vertex
    cmds.select(sel[0]+'.vtx[0:'+str(verts)+']')
    #getting all the positive vertex
    posit=cmds.filterExpand(sm=31,ex=1,smp=1)
    seam=cmds.filterExpand(sm=31,ex=1,sms=1)
    #swapping position on the positive side with the negative side
    for pos in posit:
       cmds.select(pos, sym=True)
       neg=cmds.filterExpand(sm=31,ex=1,smn=1)
       posT=cmds.xform(pos, q=1, t=1)
       negT=cmds.xform(neg[0], q=1, t=1)
       cmds.xform(pos,t=[a*b for a,b in zip(negT,reverse)])
       cmds.xform(neg[0],t=[a*b for a,b in zip(posT,reverse)]) 
    #inverting position on the seam
    for each in seam:      
      seamP=cmds.xform(each, q=1, t=1)
      seaminvP=[a*b for a,b in zip(seamP,reverse)]
      cmds.xform(each, t=(seaminvP))
    cmds.select(sel)

由于 莫里吉奥

1 个答案:

答案 0 :(得分:2)

您可以试用OpenMaya.MFnMesh来获取和设置顶点。

这是一个简单地镜像所选对象沿z轴的所有点的示例:

import maya.OpenMaya as OpenMaya

# Get selected object
mSelList = OpenMaya.MSelectionList()
OpenMaya.MGlobal.getActiveSelectionList(mSelList)
sel = OpenMaya.MItSelectionList(mSelList)
path = OpenMaya.MDagPath()
sel.getDagPath(path)

# Attach to MFnMesh
MFnMesh = OpenMaya.MFnMesh(path)

# Create empty point array to store new points
newPointArray = OpenMaya.MPointArray()

for i in range( MFnMesh.numVertices() ):
    # Create a point, and mirror it
    newPoint = OpenMaya.MPoint()
    MFnMesh.getPoint(i, newPoint)
    newPoint.z = -newPoint.z
    newPointArray.append(newPoint)

# Set new points to mesh all at once
MFnMesh.setPoints(newPointArray)

您可以使用MFnMesh.setPoints一次性设置它们,而不是一次移动它们。你必须调整你的逻辑,但希望这可以帮助你操纵Maya的api。我还应该注意,之后你还必须解决法线问题。