1

我正在用 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)

谢谢毛里齐奥

4

1 回答 1

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 进行操作。我还应该注意,您之后还必须解决法线问题。

于 2016-03-07T06:39:01.993 回答