maya python iterating a big number of vertex

╄→гoц情女王★ 提交于 2019-12-11 11:20:19

问题


I am writing a script in python for maya to swap vertex position from one side to another. Since I want the flipping to be topology based I am using the topological symmetry selection tool to find the vertex correspondence. I managed to do that using filterExpand and xform. The problem is that it is quite slow on a large poly count mesh and I was wondering how this could be done using openMaya instead.

import maya.cmds as 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)

Thanks Maurizio


回答1:


You can try out OpenMaya.MFnMesh to get and set your vertices.

Here's an example that will simply mirror all points of a selected object along their z axis:

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)

Instead of moving them one at at time you can use MFnMesh.setPoints to set them all at once. You'll have to adapt your logic to this, but hopefully this will help you out manipulating with Maya's api. I should also note that you would also have to resolve normals afterwards.



来源:https://stackoverflow.com/questions/35808363/maya-python-iterating-a-big-number-of-vertex

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!