Example: Making an Octopus Rig

This example build an octopus rig. It consists of:

• A head component (MakeHead command)

• Eight tail components for the tentacles (MakeTail command)

• A few rig icon components for controls (MakeRigIcon command).

A collections of guide nulls are passed to each command to position the elements.

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

var Octopus = new Object();

/*
   MAKE MODEL AND GLOBAL SRT ICON
*/
Octopus.Model = ActiveSceneRoot.AddModel();
Octopus.Model.Name = "Octopus"
Octopus.GlobalSRT = makeRigIcon(Octopus.Model, 4, 
                                 0,0,0,    //position
                                 1,1,1,    //icon length,width,height
                                 893,      //color
                                 "GlobalSRT"  //name
                     );

//Make the main octopus controller
Octopus.BodyCtrl = makeRigIcon(Octopus.GlobalSRT, 2, 
                                 0,4.5,0,  //position
                                 5,1.4,5,    //icon length,width,height
                                 253,      //color
                                 "BodyCtrl"  //name
                     );

                     //Make the tentacle control (manipulate to settle the tentacles)
Octopus.TentacleCtrl = makeRigIcon(Octopus.BodyCtrl, 2, 
                                 0,4.5,0,  //position
                                 2.5,1,2.5,    //icon length,width,height
                                 49,       //color
                                 "TentacleCtrl"  //name
                     );

Octopus.TentacleCtrl.Kinematics.AddConstraint("Pose",Octopus.BodyCtrl,true);


          /*
   MAKE THE HEAD
*/
guidecoll = CreateGuideColl(guidepos, guidename, Array(0,1,2));  

                     Octopus.Head = MakeHead(Octopus.BodyCtrl, //head parent
                     guidecoll,    //guide collection
                     "Octo",            //object name prefix
                     1,                //spine head and neck
                     0,                //head type (ignored unless creating box shadow)
                     3,                 //number of vertebrae
                     1,                 //stretch spine
                     null,         //spine sliders
                     null,         //ear guide collection
                     0,                 //shadow type
                     null);        //shadow parent

                     DeleteObj( guidecoll );


/*
   MAKE THE TENTACLES
*/

guidecoll = CreateGuideColl(guidepos, guidename, Array(3,4,5,6,7));  

   var lXfm = XSIMath.CreateTransform();
   lXfm.SetIdentity();
   lXfm.SetRotationFromXYZAnglesValues(0,2*3.1415/8,0);

   Octopus.Tentacles = new Array();

   for(i=0;i<8;i++)
   {
       OffsetGuideColl(guidecoll, lXfm);
       Octopus.Tentacles[i] = MakeTail(Octopus.BodyCtrl, //head parent
                            guidecoll,      //guide collection
                            6,              //number of bones
                            0,              //shadow type
                            null);          //shadow parent

        Octopus.Tentacles[i].Root.Kinematics.AddConstraint("Pose",Octopus.TentacleCtrl,true);
   }


DeleteObj( guidecoll );

Translate(Octopus.BodyCtrl, 0, 2, 0, siRelative, siView, siObj, siXYZ, null, null, null, null, null, null, null, null, null, 0);

//----------------------------------------------
// Build 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 2
   guidepos[i].Set(0,5,0); guidename[i++] = "SpineBase";
   guidepos[i].Set(0,7,0); guidename[i++] = "SpineBaseDepth";
   guidepos[i].Set(0,9,0); guidename[i++] = "SpineEndDepth";

   //3 to 7
   guidepos[i].Set(1,5,0); guidename[i++] = "TentacleBase";
   guidepos[i].Set(3,5,0); guidename[i++] = "Tentacle1";
   guidepos[i].Set(5,5,0); guidename[i++] = "Tentacle2";
   guidepos[i].Set(7,5,0); guidename[i++] = "Tentacle3";
   guidepos[i].Set(9,5,0); guidename[i++] = "TentacleTip";

   }

//-------------------------------------------------------
// 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;
}

function OffsetGuideColl( in_GuideColl, in_OffsetXfo)
{
   var GuideXfm, idx;
   for(idx=0; idx<in_GuideColl.count; idx++)
   {
       GuideXfm = in_GuideColl(idx).Kinematics.Global.Transform;
       GuideXfm.Mul(GuideXfm,in_OffsetXfo);
       in_GuideColl(idx).Kinematics.Global.Transform = GuideXfm;
   }
}


Autodesk Softimage v7.5