Skip to content

Instantly share code, notes, and snippets.

@Onefabis
Created September 26, 2018 02:55
Show Gist options
  • Save Onefabis/d637cf36682d8231c7bbd33cccf95508 to your computer and use it in GitHub Desktop.
Save Onefabis/d637cf36682d8231c7bbd33cccf95508 to your computer and use it in GitHub Desktop.
Quickly create skinned proxy mesh
import maya.api.OpenMaya as om2
import maya.cmds as mc
import proxySkinning
reload(proxySkinning)
def duplicateSkinnedMesh(joints):
# get selected components
sel = om2.MGlobal.getActiveSelectionList()
for s in xrange( sel.length() ):
dp, comp = sel.getComponent( s )
# get parent transform node from selected polygons
parentNode = om2.MFnDagNode(dp).parent(0)
parentNodeDag = om2.MDagPath().getAPathTo(parentNode)
# store inclusive matrix from transform node
parentNodeMatrix = parentNodeDag.inclusiveMatrix()
# get all faces indexes
compFn = om2.MFnSingleIndexedComponent(comp)
ids = compFn.getElements()
# get all points from the original mesh
originalPoints = om2.MFnMesh( dp ).getPoints()
#get all vertives that included in selected olygons
outVertConnects = [ x for p in ids for x in om2.MFnMesh( dp ).getPolygonVertices(p) ]
outVertSorted = list( set( outVertConnects ) )
# create new empty transform node
mdag = om2.MDagModifier()
transformNode = mdag.createNode('transform')
# rename it to the name of the original transform node
mdag.renameNode(transformNode, parentNodeDag.partialPathName()+'_dupliacated' )
mdag.doIt()
# move empty transform node with the stored MMatrix
om2.MFnTransform(transformNode).setTransformation( om2.MTransformationMatrix( parentNodeMatrix ) )
# generate sequental indices list
listSequental = range(len(outVertSorted))
# reassign vertices indexes that appearen in outVertSorted but including the length of outVertSorted, so even if original
# vertex has maximum index 240, and overall count of selected polygon vertices is 160, this vertex should be remapped like
# 240=>160 and that should be done without changing the original position in list
outVertConectsOrdered = [ x + ( listSequental[outVertSorted.index(x)] - outVertSorted[outVertSorted.index(x)] ) for x in outVertConnects]
# number of vertices that included in each polygon
outVertCounts = [ om2.MFnMesh( dp ).getPolygonVertices(p).__len__() for p in ids]
# cteate empty UV values, the new mesh will be created without UVs
vValues = [ 0.0 ] * len(ids)
# create empty MFnMesh
outFnMesh = om2.MFnMesh()
# get filtered points from the original points list
outPoints = [ originalPoints[k] for k in set(outVertConnects) ]
# create the new mesh under the empty transform node
shapeNode = outFnMesh.create( outPoints, outVertCounts, outVertConectsOrdered, vValues, vValues, transformNode)
# rename created shape
mShapeDag = om2.MDagModifier()
mShapeDag.renameNode( shapeNode, parentNodeDag.partialPathName()+'Shape_dupliacated' )
mShapeDag.doIt()
# get all shaders IDs assigned to original mesh polygons
shaders, indices = om2.MFnMesh( dp ).getConnectedShaders(0)
# sort materials indexes
sharedFaceIDs = [ indices[o] for o in ids ]
# iterate through each shader
newShapeIt = om2.MItMeshPolygon( shapeNode )
for s in xrange( len( shaders ) ):
# create new Set from current shader
shaderSet = om2.MFnSet( shaders[s] )
selComponent = om2.MSelectionList()
# iterate through each polygon of the new mesh
for k in xrange(newShapeIt.count()):
newShapeIt.setIndex(k)
if sharedFaceIDs[k] == s:
# add filtered components to the empty MSelectionList
selComponent.add( (om2.MDagPath().getAPathTo(shapeNode), newShapeIt.currentItem() ) )
# assign MSelectionList of the components to the current shader Set
shaderSet.addMembers( selComponent )
om2.MGlobal.setSelectionMode( 0 )
om2.MGlobal.setActiveSelectionList( om2.MSelectionList().add( om2.MDagPath().getAPathTo(transformNode) ), 0 )
#mc.skinCluster( joints, parentNodeDag.partialPathName()+'Shape_dupliacated', dr=4.0)
def collectSkinData():
shape = mc.listRelatives( p=1 )[0]
tr = mc.listRelatives( shape, p=1 )[0]
skin = mc.ls( mc.listHistory( tr, pdo=1 ), typ='skinCluster' )[0]
joints = mc.skinCluster( skin, q=1, wi=1 )
curPose = mc.dagPose( joints, save=1, name='skinToPose' )
bPose = mc.dagPose( joints, q=1, bindPose=1 )
mc.dagPose( bPose, r=1 )
duplicateSkinnedMesh(joints)
mc.dagPose( curPose, restore=1 )
mc.delete( curPose )
proxySkinning.skinTo(srcMesh=tr, destMesh=tr + 'Shape_dupliacated')
def removeMultiPoses():
sel = mc.ls( sl=1 )
skin = mc.ls( mc.listHistory( sel[0], pdo=1 ), typ='skinCluster' )[0]
joints = mc.skinCluster( skin, q=1, wi=1 )
#mc.dagPose( joints, q=1, bindPose=1 )
mc.delete( mc.ls( typ='dagPose' ) )
mc.dagPose( joints, bp=1,s=1 )
collectSkinData()
#removeMultiPoses()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment