1

Maya が頂点位置をある側から別の側にスワップするためのスクリプトを Python で作成しています。フリップをトポロジ ベースにしたいので、トポロジ シンメトリ選択ツールを使用して頂点の対応を見つけます。filterExpand と xform を使用してそれを行うことができました。問題は、ポリゴン数の多いメッシュでは非常に遅いことであり、代わりに openMaya を使用してこれを行う方法を考えていました。

maya.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)

一度に 1 つずつ移動する代わりに、 を使用MFnMesh.setPointsして一度にすべてを設定できます。ロジックをこれに適応させる必要がありますが、Maya の API を操作するのに役立つことを願っています。また、後で法線を解決する必要があることにも注意してください。

于 2016-03-07T06:39:01.993 に答える