Hi,
I was trying to hide some joints of rig but because some geo was parented to the joints it made it a little difficult. So here is a tool I wrote to help separate some simple polygon geometry pieces from the animation rig while still following the animation rig.
Some tips it has are creating a no child duplicate of a joint with identical orient and rotate order. Making connections in MEL and a little on hierarchy. (note I commented out the error checking so it was easier to download).
Hope you find this helpful.
Cheers,
Nate
global proc
na_getGeoInWorldWhileFollowAnimRig_unitTest()
{
select -d;
joint -p 0 0 0 ;
joint -p 1 0 0 ;
joint -e -zso -oj xyz -sao yup joint1;
joint -p 2 0 0 ;
joint -e -zso -oj xyz -sao yup joint2;
joint -p 3 0 0 ;
joint -e -zso -oj xyz -sao yup joint3;
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
move -rpr 1 0 0 ;
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
move -rpr 2 0 0 ;
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
move -rpr 3 0 0 ;
select -r pCube1 ;
parent pCube1 joint1 ;
select -r pCube2 ;
parent pCube2 joint2 ;
select -r pCube3 ;
parent pCube3 joint3 ;
select -r pCube1 ;
move 0 0 0 pCube1.scalePivot pCube1.rotatePivot ;
select -r pCube3 ;
select -cl ;
select -r pCube2 ;
move 1 0 0 pCube2.scalePivot pCube2.rotatePivot ;
select -r pCube3 ;
move 2 0 0 pCube3.scalePivot pCube3.rotatePivot ;
na_getGeoInWorldWhileFollowAnimRig({"pCube1","pCube2","pCube3"});
}
/** Get geo in world hierarchy while following animation rig
@pre geo single instance shape and it is part of animation rig by being child of a joint or transform
*/
global proc string[]
na_getGeoInWorldWhileFollowAnimRig(string $geoArray[])
{
//na_assertObjectExist($geoArray);
//na_assertTypeInList( $geoArray, {"transform"} );
string $geo[] = $geoArray;
string $parent[] = {};
//uses single geo instance assumption, and joint parent assumption
$parent = `listRelatives -parent -f $geo`;
//na_assertTypeInList( $parent, {"joint","transform"} );
//na_assertSizeEqualArg( $parent, size($geo) );
//parent $geo to the world so
parent -w $geo;
//goal is to have geometry scaling and moving along with rig in separate hierarchy
//
string $to = "";
string $toArray[] = {};
string $toTemp[] = {};
for($i = 0; $i < size($geo); $i++)
{
$from = $parent[$i];
//to preserve orient we make a duplicate
$toTemp = `duplicate -rr $from`;
//na_assertSizeEqualArg( $toTemp, 1 );
$to = $toTemp[0];
delete `listRelatives -children -f $to`;
//geometry almost moving with rig
parentConstraint -mo -weight 1 $from $to;
connectAttr -f ($from+".scaleX") ($to+".scaleX");
connectAttr -f ($from+".scaleY") ($to+".scaleY");
connectAttr -f ($from+".scaleZ") ($to+".scaleZ");
//geometry moving with rig
if( size(`listRelatives -parent -f $to`) != 0 ){
parent -w $to;
}
parent $geo[$i] $to;
$toArray[size($toArray)] = $to;
}
return $toArray;
}