この例では、キャラクタ開発キットのリグ設定キット コマンドを使って、単純な二足歩行リグをビルドします。 コマンドにはインタフェースにあるものと同じオプションが複数含まれています。たとえば、胴体のクォータニオン脊椎を選択したり、前腕と上腕の分割を定義したり、脚の上向きベクトルの位置をコントロールできます。
各コマンドは、位置付けられた「ガイド」ヌルの配列から読み出されます(スクリプトの最後を参照してください)。 ユーザ独自のガイド オブジェクトをセットアップすることも、Softimage の既定のガイドで使用可能なガイドを使用することもできます(「デフォルト ガイド内のガイド オブジェクトを識別する」を参照)。
また、各コマンドは作成されたオブジェクトのリストを返します。これは、リグ コンポーネントの親にすべきオブジェクトの名前を決定するのに役立ちます。 ただし、このスクリプトでは、スクリプトの記述者は各コマンドで作成されるオブジェクトの名前を知っていました(「CDK オブジェクト リファレンス」または「コマンドおよびスクリプト リファレンス」を参照)。また、戻り値を使用してエンベロープまたは非表示グループにコンポーネントを追加することなどもできます。 戻り値の使用に関する詳細については、「戻り値を使って作業する」を参照してください。
// 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;
}