Maya API Python对称表与MRichSelection?

时间:2017-06-22 14:51:18

标签: python maya

我想知道是否有办法访问MRichSelection的对称表,结果是正面,接缝和负面,正面和负面按顶点id对应排序。即:顶点id 15是与vert id 350相关的对称性。它们都在正和负列表中的索引5处。 我知道我可以使用filterXpand实现类似的东西,但我相信这些列表没有以我可以访问相反顶点的方式排序。

1 个答案:

答案 0 :(得分:1)

我不知道你是否找到了解决方案,但我会发布我的未来TD寻找解决方案。

因此,我们假设您想要在YZ平面上获得左右之间的相应顶点。你有2个不同的选择。使用MRichSelection处理对称表。或者通过获取对面的最小距离向量来自己计算顶点。注意:如果使用MRichSelection方法,则需要确保在视口中放置对称模式。 我将展示两个答案,让我们开始吧:

另请注意:如前所述,我将计算YZ平面。因此,如果需要,请根据自己的喜好进行调整。

解决方案1(自己计算):

#importing the OpenMaya Module
from maya.api import OpenMaya as om
#converting selected object into MObject and MFnMesh functionset
mSel=om.MSelectionList()
mSel.add(cmds.ls(sl=1)[0])
mObj=mSel.getDagPath(0)
mfnMesh=om.MFnMesh(mObj)
#getting our basePoints
baseShape = mfnMesh.getPoints()
#this function can be used to revert the object back to the baseShape
mfnMesh.setPoints(baseShape)
#getting l and r verts
mtol=0.02# this will be our mid tolerance, if the mesh is not completely symmetric on the mid
lVerts=[]#for storing left Verts
rVerts=[]#for storing right Verts
mVerts=[]#for storing mid Verts
corrVerts={} #for storing correspondign verts
for i in range(mfnMesh.numVertices): #iteratign through all the verts on the mesh
    thisPoint = mfnMesh.getPoint(i) #getting current point position
    if thisPoint.x>0+mtol: # if pointValue on x axis is bigger than 0+midTolerance
        lVerts.append((i, thisPoint))#append to left vert storage list(i = vert index, thisPoint = vert Mpoint position)
    elif thisPoint.x<0-mtol: #opposite of left vert calculation
        rVerts.append((i, thisPoint))
    else: #if none of the above, assign to mid verts
        mVerts.append((i, thisPoint))
rVertspoints=[i for v,i in rVerts] #getting the vert mPoint positions of the right side
for vert, mp in lVerts: #going through our left points, unpacking our vert index and mPoint position()
    nmp=om.MPoint(-mp.x, mp.y, mp.z) #storing the reversed mpoint of the left side vert
    rp = mfnMesh.getClosestPoint(nmp)#getting the closest point on the mesh
    if rp[0] in rVertspoints: #cheking if the point is in the right side
        corrVerts[vert] = rVerts[rVertspoints.index(rp[0])][0] #adding it if it is true
    else:#if it is not, calculate closest vert
        #iterating through rVertspoints and find smallest distance
        dList=[nmp.distanceTo(rVert) for rVert in rVertspoints]#distance list for each vert based on input point
        mindist = min(dList)#getting the closest distance
        corrVerts[vert] = rVerts[dList.index(mindist)][0]#adding the vert
#now the corrVerts will have stored the corresponding vertices from left to right

解决方案2(使用MRichSelection):

#MAKE SURE SYMMETRY IN THE VIEWPORT IS TURNED ON TO WORK! (will also work with topological symmetry)
#importing the OpenMaya Module
from maya.api import OpenMaya as om
#converting selected object into MObject and MFnMesh functionset
mSel=om.MSelectionList()
mSel.add(cmds.ls(sl=1)[0])
mObj=mSel.getDagPath(0)
mfnMesh=om.MFnMesh(mObj)
#getting our basePoints
baseShape = mfnMesh.getPoints()
#this function can be used to revert the object back to the baseShape
mfnMesh.setPoints(baseShape)
#getting l and r verts
mtol=0.02# this will be our mid tolerance, if the mesh is not completely symmetric on the mid
lVerts=[]#for storing left Verts
corrVerts={} #for storing correspondign verts
for i in range(mfnMesh.numVertices): #iteratign through all the verts on the mesh
    thisPoint = mfnMesh.getPoint(i) #getting current point position
    if thisPoint.x>0+mtol: # if pointValue on x axis is bigger than 0+midTolerance
        lVerts.append((i, thisPoint))#append to left vert storage list(i = vert index, thisPoint = vert Mpoint position)
#selecting our verts with symmetry on
SymSelection = cmds.select(["%s.vtx[%s]"%(mObj,i)  for i,v in lVerts], sym=True)
#getting the rich selection. it will store the symmetry iformation for us
mRichBase = om.MGlobal.getRichSelection()
lCor = mRichBase.getSelection()#this will store our lSide verts as an MSelectionList
rCor = mRichBase.getSymmetry()#this will symmetry verts as an MSelectionList
mitL = om.MItSelectionList(lCor)#creating iterative lists so we can get the components
mitR = om.MItSelectionList(rCor)
while not mitL.isDone():#iterating through the left list
    mitLComp = mitL.getComponent()#getting dag path and components of leftside
    mitRComp = mitR.getComponent()#getting dag path and components of rightside
    mitLCorVert = om.MItMeshVertex(mitLComp[0], mitLComp[1]) #creating our iterative vertex lists
    mitRCorVert = om.MItMeshVertex(mitRComp[0], mitRComp[1])
    while not mitLCorVert.isDone():#iterating through our verts
        corrVerts[mitLCorVert.index()] = mitRCorVert.index()#adding corresponding verts to our dictionary
        mitLCorVert.next()#go to next vert. needed to stop loop
        mitRCorVert.next()#go to next vert. needed to stop loop
    mitL.next()#go to next selection in list if more. needed to stop loop
    mitR.next()#go to next selection in list if more. needed to stop loop
cmds.select(cl=1)#deseleting our verts
#now the corrVerts will have stored the corresponding vertices from left to right

希望它能帮助你们所有人,寻找一些解决方案。 干杯 Bjarke Rauff,Rigging TD。