例: カスタム リグ スクリプトの分析

 
 
 

この例では、キャラクタ開発キットのリグ設定キット コマンドを使って、単純な二足歩行リグをビルドします。 コマンドにはインタフェースにあるものと同じオプションが複数含まれています。たとえば、胴体のクォータニオン脊椎を選択したり、前腕と上腕の分割を定義したり、脚の上向きベクトルの位置をコントロールできます。

各コマンドは、位置付けられた「ガイド」ヌルの配列から読み出されます(スクリプトの最後を参照してください)。 ユーザ独自のガイド オブジェクトをセットアップすることも、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;
}