///////////////////////////////////////////////////////////////// // oriJointTool.mel // // Sean Nolan // sean@snolan.net // // Interactive joint orientation script // // This was orginally Paul Thuriot's script but his did not // keep the orginal joint name and joint scale. // // Should work for Maya 6 and 7 now ///////////////////////////////////////////////////////////////// global proc oriJointTool() { if(`window -exists oriJointToolWin`) deleteUI oriJointToolWin; window -t "Orient Joint" -tlb true oriJointToolWin; rowColumnLayout -nc 2 -cw 1 90 -cw 2 90; button -l "Orient Joint" -c "templateSkeleton_createTemp_doIt"; button -l "Redraw Joints" -c "pickWalk -d up;pickWalk -d up;templateSkeleton_reBuildChain_doIt;";; text -l " Arrow Scale"; floatField -v 1.0 -precision 1 scSize; window -e -w 190 -h 90 oriJointToolWin; showWindow oriJointToolWin; } //==================================================================== // DESCRIPTION: will take the topNode and relist the joint children. //====================================================================== proc string[] templateSkeleton_reList(string $topNode) { int $i; global string $gJointNames[]; string $relisted[]; clear($relisted); $relisted = `ls -type joint -sl -dag`; for($i = 0; $i < `size($relisted)`;$i++) { $gJointNames[$i] = $relisted[$i]; print $gJointNames[$i]; } return $relisted; } //==================================================================== // DESCRIPTION: will lock and make unkeyable all attrs on node. //====================================================================== proc templateSkeleton_lockOff(string $node) { string $attrs[] = `listAttr -k $node`; for($each in $attrs) setAttr -k 0 -l 1 ($node + "." + $each); } //==================================================================== // DESCRIPTION: this will create the rotation group and return its name. //====================================================================== proc string templateSkeleton_createRotGrp(string $fromJt, string $toJt, string $xtraGrp) { string $rotGrpA = `group -em -name ($fromJt+"RotGrpAN_#")`; string $rotGrpB = `group -em -name ($fromJt+"RotGrpBN_#")`; string $rotGrpC = `group -em -name ($fromJt+"ManRotGrpCN_#")`; // create arrows that show z rotation string $arrow = `curve -d 1 -p 0 0.6 0 -p -0.4 0 0 -p -0.2 0 0 -p -0.2 -0.6 0 -p 0.2 -0.6 0 -p 0.2 0 0 -p 0.4 0 0 -p 0 0.6 0 -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -name ($fromJt + "upArrow_#")`; //move arrow in y float $arrowSize = `floatField -q -v scSize`; scale -r $arrowSize $arrowSize $arrowSize; move -os 0 1 0; select -r $arrow; if(!`attributeExists "toJoint" $arrow`) addAttr -dt "string" -ln "toJoint" $arrow; if(!`attributeExists "toUpLoc" $fromJt`) addAttr -dt "string" -ln "toUpLoc" $fromJt; connectAttr -f ($fromJt+".toUpLoc")($arrow +".toJoint"); connectAttr -f ($fromJt+".rotateArrow") ($rotGrpB +".rx"); parent $arrow $rotGrpC; parent $rotGrpC $rotGrpB; parent $rotGrpB $rotGrpA; pointConstraint $fromJt $rotGrpA; aimConstraint -u 0 1 0 -wut "scene" $toJt $rotGrpA; templateSkeleton_lockOff $rotGrpC; setAttr -e -l 0 -k 1 ($rotGrpC +".rx"); templateSkeleton_lockOff $rotGrpB; string $parent[] = `parent $rotGrpA $xtraGrp`; return $parent[0]; } //====================================================================== // DESCRIPTION: this will find the up vector locator via connections //====================================================================== proc string templateSkeleton_getAimUpObj(string $joint) { string $loc[] = `listConnections -s 0 -d 1 -scn 1 ($joint+".toUpLoc")`; if(!`objExists $loc[0]`) error("templateSkeleton_getAimUpObj -> "+$loc[0]+" doesn't exist"); return $loc[0]; } //====================================================================== // DESCRIPTION: will create the Template Joint Chains via selection //====================================================================== global proc templateSkeleton_createTemp_doIt() { string $sel[] = `ls -sl -type "joint"`; if(size($sel) < 1) error("templateSkeleton_createTemp_doIt -> Select one or more Joints"); for($each in $sel) templateSkeleton_createTemp $each; select -cl; //print $gJointNames; } //====================================================================== // DESCRIPTION: will create the reBuilt Joint Chains from templates // via selection //====================================================================== global proc templateSkeleton_reBuildChain_doIt() { string $sel[] = `ls -sl`; if(size($sel) < 1) error("templateSkeleton_reBuildChain_doIt -> Select at least one templateChain TopNode"); select -cl; for($each in $sel) templateSkeleton_reBuildChain $each; select -cl; } //==================================================================== // DESCRIPTION: this will create the template chain group //==================================================================== global proc string templateSkeleton_createTemp(string $chainTopNode) { //to surpress any cycle errors cycleCheck -e off; string $tempChainTop; if(!`objExists $chainTopNode`) error("templateSkeleton_createTemp -> "+$chainTopNode+" doesn't exist"); if(!`objectType -i "joint" $chainTopNode`) error("templateSkeleton_createTemp -> "+$chainTopNode+" not of type \"joint\""); string $grpTopNode = `group -em -n "templateSkeletonN_#"`; string $jointTopNode = `group -em -n "jointsN_#"`; string $xtrasTopNode = `group -em -n "xtrasN_#"`; templateSkeleton_lockOff $grpTopNode; templateSkeleton_lockOff $jointTopNode; templateSkeleton_lockOff $xtrasTopNode; if(!`attributeExists "rotateArrowScale" $grpTopNode`) { addAttr -ln "rotateArrowScale" -at double -min 0 -dv 1.0 $grpTopNode; } setAttr -e -keyable true ($grpTopNode+".rotateArrowScale"); string $fullPathNames[] = `parent $jointTopNode $xtrasTopNode $grpTopNode`; // print $fullPathNames; string $topJoint[] = `parent $chainTopNode $fullPathNames[0]`; string $reListed[] = `templateSkeleton_reList $topJoint[0]`; for ($i = 0; $i < (size($reListed) - 1); $i++) { if(!`attributeExists "rotateArrow" $reListed[$i]`) { addAttr -ln "rotateArrow" -at double -min -360 -max 360 $reListed[$i]; } setAttr -e -keyable true ($reListed[$i]+".rotateArrow"); string $rotGrp = `templateSkeleton_createRotGrp $reListed[$i] $reListed[($i+1)] $xtrasTopNode`; connectAttr -f ($grpTopNode + ".rotateArrowScale") ($rotGrp + ".sx"); connectAttr -f ($grpTopNode + ".rotateArrowScale") ($rotGrp + ".sy"); connectAttr -f ($grpTopNode + ".rotateArrowScale") ($rotGrp + ".sz"); templateSkeleton_lockOff $rotGrp; } select $grpTopNode; print "Done creating Template Skeleton"; $tempChainTop = $grpTopNode; return $tempChainTop; } //====================================================================== // DESCRIPTION: this will create the rebuilt chain with correct axis //====================================================================== global proc string templateSkeleton_reBuildChain(string $chainTopNode) { string $rebuiltChain; global string $gJointNames[]; string $newSkele[]; float $jointRadius[]; string $version = `about -v`; clear($newSkele); string $version = `about -v`; string $versionBuffer[]; tokenize $version "." $versionBuffer; $version = $versionBuffer[0] + "." + $versionBuffer[1]; float $mayaVersion = $version; if(!`objExists $chainTopNode`) error("templateSkeleton_reBuildChain -> "+$chainTopNode+" doesn't exist"); string $joints[] = `ls -type joint -dag $chainTopNode`; print $joints; for($i = 0; $i < size($joints); $i++) { $newSkele[$i] = `joint -p $i 0 0`; if($mayaVersion > 6.0) { $jointRadius[$i] = `getAttr ($joints[$i] + ".radius")`; } } for($i = 0; $i < (size($joints)-1); $i++) { float $xyzs[] =`xform -q -a -ws -t $joints[$i]`; xform -a -ws -t $xyzs[0] $xyzs[1] $xyzs[2] $newSkele[$i]; string $aimObj = `templateSkeleton_getAimUpObj $joints[$i]`; string $aims[]=`aimConstraint -aim 1 0 0 -u 0 1 0 -wuo $aimObj -wut "objectrotation" $joints[$i+1] $newSkele[$i]`; float $rotss[]=`getAttr ($newSkele[$i]+".rotate")`; delete $aims; setAttr ($newSkele[$i]+".rotate") 0 0 0; setAttr ($newSkele[$i]+".jointOrient") $rotss[0] $rotss[1] $rotss[2]; if($mayaVersion > 6.0) { //Maya 7 feature. Keep the same joint raduis setAttr($newSkele[$i] + ".radius") $jointRadius[$i]; } } if($mayaVersion > 6.0) { //Make the last joint the same radius setAttr($newSkele[$i + 1] + ".radius") $jointRadius[$i]; } float $trans[] =`xform -q -a -ws -t $joints[$i]`; xform -a -ws -t $trans[0] $trans[1] $trans[2] $newSkele[$i]; for($each in $newSkele) setAttr ($each + ".rotateOrder") 3; string $parentTest[] = `listRelatives -p -pa $newSkele[0]`; if(`objExists $parentTest[0]`) { string $newParent[]=`parent -w $newSkele[0]`; $rebuiltChain = $newParent[0]; } else $rebuiltChain = $newSkele[0]; delete $chainTopNode; //rename new joints to what the old joints were named for($i = 0; $i < `size($joints)`; $i++) rename $newSkele[$i] $gJointNames[$i]; return $rebuiltChain; }