Example: Anatomy of a Custom Rig Script

This example builds a simple biped using the Character Development Kit’s rigging kit commands. You'll notice that the commands have the same options you have in the interface--for example, you can choose a quaternion spine for the torso, define forearm and bicep divisions, control the location of the leg's up vector, etc.

Each command reads from an array of positioned “guide” nulls (see the end of the script). You can either set up your own guide objects, or use the guides available in the XSI’s default guides (see Identifying Guide Objects in the Default Guides).

Each command also returns a list of objects created, which helps you determine the name of object the rig component should be parented to. In this script, however, the script writer knew the names of the objects each command creates (this is easy to figure out by consulting the Character Development Kit Object Reference at the end of this chapter or the C# and Scripting Referencex). You can also use return values to add components to envelopes or hidden groups, etc. For more information about using return values, refer to Working with Return Values.

// build list of guide object positions and names
BuildGuideArrays();

var Biped = new Object();

// make the model and the globalSRT icon
Biped.Model = ActiveSceneRoot.AddModel();
Biped.GlobalSRT = makeRigIcon(Biped.Model, 4, 
                                 0,0,0,    //position
                                 1,1,1,    //icon length,width,height
                                 893,      //color
                                 "GlobalSRT"  //name
                     );

// make the torso
guidecoll = CreateGuideColl(guidepos, guidename, Array(0,1,2,3,4,5,6,7,8,9));  
Biped.Torso = makeTorso(Biped.GlobalSRT ,  //parent object
                                   4,      //nb of torso divisions
                                   false,  //use fixed length spine
                                   guidecoll,  //torso guides: 
                                   0,       //use square icons for torso controls
                                   1,       //spine head and neck
                                   null,    //spine parameter sliders
                                   0,       //no shadow
                                   null,    //no shadow parent
                                   0);      //don't use negative scaling
DeleteObj( guidecoll );

// make the arms. first the left arm, then the right arm
// left arm
guidecoll = CreateGuideColl(guidepos, guidename, Array(6,10,11));  

Biped.LArm = MakeArm(Biped.Torso.LEff,  //parent object
                 guidecoll,     //guide objects
                 "L",           //arm object prefix
                 Biped.Torso.LEff, //object to pos. constrain arm root to
                 0,                //#forearm divs
                 0,                //#bicep divs
                 0,                //no shadow
                 null,          //no shadow parent
                 null,          //hand root
                 0);               //don't use negative scale

DeleteObj( guidecoll );

// right arm 
guidecoll = CreateGuideColl(guidepos, guidename, Array(9,12,13));  

Biped.LArm = MakeArm(Biped.Torso.REff,  //parent object
                 guidecoll,     //guide objects
                 "R",           //arm object prefix
                 Biped.Torso.REff, //object to pos. constrain arm root to
                 0,                //#forearm divs
                 0,                //#bicep divs
                 0,                //no shadow
                 null,          //no shadow parent
                 null,          //hand root
                 0);               //don't use negative scale

DeleteObj( guidecoll );

// make the head
guidecoll = CreateGuideColl(guidepos, guidename, Array(14,15,16));  

Biped.Head = MakeHead( Biped.Torso.Spine.TopVertebra, 
                     guidecoll, 
                     "",
                     1,            //use spine-type head and neck 
                     0,            //box shadow head type 
                     2,            //number of neck spine divisions
                     1,            //neck stretches to meet head controller
                     null,      //neck sliders
                     null,      //no ears (guide collection for ears) 
                     0,            //no shadow
                     null);        //no shadow parent

DeleteObj( guidecoll );


// make the legs, first the left then the right
//left leg
guidecoll = CreateGuideColl(guidepos, guidename, Array(4,17,18));  
Biped.LeftLeg = MakeLeg(  Biped.Model,  //rig model
                         Biped.Torso.HipBone,//leg parent
                         "L",          //object name prefix
                         guidecoll,    //1)top of leg, 2)knee, 3)ankle
                         1,                //place leg upvector behind leg
                         0,                //#thigh divisions
                         0,                 //no shadow
                         null);             //no shadow parent
DeleteObj( guidecoll );

//right leg
guidecoll = CreateGuideColl(guidepos, guidename, Array(7,19,20));  
Biped.RightLeg = MakeLeg(  Biped.Model,  //rig model
                         Biped.Torso.HipBone,//leg parent
                         "R",          //object name prefix
                         guidecoll,    //1)top of leg, 2)knee, 3)ankle
                         1,                //place leg upvector behind leg
                         0,                //#thigh divisions
                         0,                 //no shadow
                         null);             //no shadow parent
DeleteObj( guidecoll );

// make the feet, first the left, then the right
//left foot
guidecoll = CreateGuideColl(guidepos, guidename, Array(21,22,23,18,24,25,26));  

Biped.LeftFoot = MakeFoot( Biped.Model,  //rig model
                     Biped.GlobalSRT, //parent of foot controls
                     "L",          //short object name prefix
                     "Left",       //long object name prefix
                     guidecoll,    //foot guide objects
                     null,             //foot sliders
                     0,                //create extenstion icon (used for dog leg)
                     0,                //no shadow
                     null);            //no shadow parent

//attach the leg to the foot
Biped.LeftLeg.Eff.AddChild(Biped.LeftFoot.Root);
Biped.LeftLeg.Eff.Kinematics.AddConstraint("Position", Biped.LeftFoot.BaseGuide , false);

                     DeleteObj( guidecoll );

//right foot
guidecoll = CreateGuideColl(guidepos, guidename, Array(27,28,29,20,30,31,32));  

Biped.RightFoot = MakeFoot( Biped.Model,  //rig model
                     Biped.GlobalSRT, //parent of foot controls
                     "R",          //short object name prefix
                     "Right",      //long object name prefix
                     guidecoll,    //foot guide objects
                     null,             //foot sliders
                     0,                //create extenstion icon (used for dog leg)
                     0,                //no shadow
                     null);            //no shadow parent

//attach the leg to the foot
Biped.RightLeg.Eff.AddChild(Biped.RightFoot.Root);
Biped.RightLeg.Eff.Kinematics.AddConstraint("Position", Biped.RightFoot.BaseGuide , false);

                     DeleteObj( guidecoll );


//----------------------------------------------
// Builds an array of guide positions and names
//----------------------------------------------
function BuildGuideArrays()
{

   guidepos  = new Array();
   guidename = new Array();


   for (i=0;i<33;i++)
   { 
       guidepos[i] = XSIMath.CreateVector3(); 
   }

   i=0;

   //0 to 3
   guidepos[i].Set(0,18,-0.5); guidename[i++] = "SpineBase";
   guidepos[i].Set(0,20,-0.5); guidename[i++] = "SpineBaseDepth";
   guidepos[i].Set(0,22,-0.5); guidename[i++] = "SpineEndDepth";
   guidepos[i].Set(0,24,-0.5); guidename[i++] = "SpineEnd";

   //4 to 6
   guidepos[i].Set(1.75,16,0); guidename[i++] = "LeftLegStart";
   guidepos[i].Set(2,24,0); guidename[i++] = "LeftShoulderStart";
   guidepos[i].Set(4,24,0); guidename[i++] = "LeftShoulderEnd";

   //7 to 9
   guidepos[i].Set(-1.75,16,0); guidename[i++] = "RightLegStart";
   guidepos[i].Set(-2,24,0); guidename[i++] = "RightShoulderStart";
   guidepos[i].Set(-4,24,0); guidename[i++] = "RightShoulderEnd";

   //10 to 11
   guidepos[i].Set(8,24,-1); guidename[i++] = "LeftElbow";
   guidepos[i].Set(12,24,0); guidename[i++] = "LeftHand";

   //12 to 13
   guidepos[i].Set(-8,24,1); guidename[i++] = "RightElbow";
   guidepos[i].Set(-12,24,0); guidename[i++] = "RightHand";

   //14 to 16
   guidepos[i].Set(0,24,-0.5); guidename[i++] = "NeckBase";
   guidepos[i].Set(0,25,-0.5); guidename[i++] = "Neck";
   guidepos[i].Set(0,26,-0.5); guidename[i++] = "Head";

   //17 to 18
   guidepos[i].Set(1.75,9,0.5); guidename[i++] = "LeftKnee";
   guidepos[i].Set(1.75,2,0); guidename[i++] = "LeftAnkle";

   //19 to 20
   guidepos[i].Set(-1.75,9,0.5); guidename[i++] = "RightKnee";
   guidepos[i].Set(-1.75,2,0); guidename[i++] = "RightAnkle";

   //21 to 26
   guidepos[i].Set(1.75,0,0); guidename[i++] = "LMiddlePivot";
   guidepos[i].Set(1.65,0,0); guidename[i++] = "LRightPivot";
   guidepos[i].Set(1.85,0,0); guidename[i++] = "LLeftPivot";
   guidepos[i].Set(1.75,1,1); guidename[i++] = "LLeftFoot";
   guidepos[i].Set(1.75,0.5,2); guidename[i++] = "LLeftToe";
   guidepos[i].Set(1.75,0.5,3); guidename[i++] = "LLeftToe2";

   //27 to 32
   guidepos[i].Set(-1.75,0,0); guidename[i++] = "RMiddlePivot";
   guidepos[i].Set(-1.85,0,0); guidename[i++] = "RRightPivot";
   guidepos[i].Set(-1.65,0,0); guidename[i++] = "RLeftPivot";
   guidepos[i].Set(-1.75,1,1); guidename[i++] = "RLeftFoot";
   guidepos[i].Set(-1.75,0.5,2); guidename[i++] = "RLeftToe";
   guidepos[i].Set(-1.75,0.5,3); guidename[i++] = "RLeftToe2";

   }

//-------------------------------------------------------
// From array of positions and names created in BuildGuideArrays(),
// create a collection of guide nulls
//-------------------------------------------------------
function CreateGuideColl( in_aGuidePositions, in_aGuideNames, in_Indices)
{

   var lXfm = XSIMath.CreateTransform();
   var guidecoll = new ActiveXObject("XSI.Collection");

   var idx;
   for(idx=0; idx<in_Indices.length; idx++)
   {
//     logmessage(in_Indices[idx] + "  " + in_aGuideNames[in_Indices[idx]]);
       guidecoll.Add( GetPrim("Null", in_aGuideNames[in_Indices[idx]]) ); 
       lXfm.SetTranslation(in_aGuidePositions[in_Indices[idx]]);
       guidecoll(idx).Kinematics.Global.Transform = lXfm;
   }

   return guidecoll;
}



SOFTIMAGE|XSI v6.01     

Return to Softimage XSI Index