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