T
ransferring the weights back
Below is a MEL script that will transfer the weights from one mesh and apply them to other meshes.
To run this script:
-Select all of the code below and paste it in to the script editor
-Select all the meshes you'd like to paste weights to
-Shift-Select the mesh that has proper weighting
-Select all the code in the Script Editor
-Hit 'Enter'
Code:
//////////////////////////////////////////
//Select meshes to transfer weight to, then shift-select the mesh with weights, then run this script
string $userSel[] = `ls -sl`;
if(`size($userSel)` > 1)
{
select $userSel[((`size($userSel)`) - 1)];
string $cageMesh[] = `ls -sl`;
select $userSel;
select -tgl $cageMesh;
string $pieces[] = `ls -sl`;
//get inputs of weights in skin
string $theJoints[] = `skinCluster -q -wi $cageMesh`;
if(`size($theJoints)` > 0 && $cageMesh[0] != "")
{
int $counter;
int $sizer = size($pieces);
for ($counter = 0; $counter < $sizer; $counter++)
{
///////////////////////////////////////////////////////////////////////////////////////
//Determine if skinCluster exists on piece
string $skins[] ;
clear $skins ;
string $hist[] = `listHistory -pdo 1 -il 2 $pieces[$counter]` ;
string $h ;
for ($h in $hist)
{
if (nodeType($h) == "skinCluster")
{
$skins[size($skins)] = $h ;
}//end of if skinCluster type exists
}//end of for loop through history
/////////////////////////////////////////////////////////////////////////////////////////
//If skinCluster Doesn't exist, add skinCluster
if(`size($skins)` == 0)
{
select $pieces[$counter] $theJoints;
newSkinCluster "-tsb -mi 10 -dr 10" ;
}//end of apply skinCluster if none found
//////////////////////////////////////////////////////////////////////////////////////////
//Add all influences from cageMesh
int $counterInf;
int $sizerInf = size($theJoints);
string $pieceJoints[] = `skinCluster -q -wi $pieces[$counter]`;
for ($counterInf = 0; $counterInf < $sizerInf; $counterInf++)
{
int $found = stringArrayContains($theJoints[$counterInf], $pieceJoints);
if($found == 0){skinCluster -e -ai $theJoints[$counterInf] $skins[0];}
}//end of for loop through adding all cageJoints
///////////////////////////////////////////////////////////////////////////////////////////
//Remove extra joints that don't match those in cageMesh skinCluster
string $theJoints[] = `skinCluster -q -wi $cageMesh`;
string $pieceJoints[] = `skinCluster -q -wi $pieces[$counter]`;
string $diffJoints[] = stringArrayRemove($theJoints, $pieceJoints);
int $counterInf;
int $sizerInf = size($diffJoints);
if(`size($diffJoints)` > 0)
{
for ($counterInf = 0; $counterInf < $sizerInf; $counterInf++)
{
skinCluster -e -ri $diffJoints[$counterInf] $skins[0];
}//end of for loop through removing extra joints
}//end of if any joints are different
//////////////////////////////////////////////////////////////////////////////////////////
//Transfer the Weights
select $cageMesh $pieces[$counter];
copySkinWeights -noMirror -surfaceAssociation closestPoint -influenceAssociation closestJoint -influenceAssociation oneToOne -influenceAssociation name -normalize;
//////////////////////////////////////////////////////////////////////////////////////////
//Finalize
print ("\nSkin Applied/Weights Transfered: " + ($counter + 1) + "/" + $sizer);
}//end of loop through pieces
select $userSel;
}//end of if there is a skinCluster to copy from
}//end of if user has selected enough items