エンベロープ

 
 
 

2 段階のプロセスでエンベロープを構築する場合、まずはチェインを作成し、次にチェインにポーズを設定します。 このセクションでは、これらの 2 段階の手順について詳しく説明します。

2 段階の手順で作業する理由は、チェインの作成時にルートとボーンの向きを設定することが難しいからです。 X3DObject.Add2DChain または X3DObject::Add2DChainX3DObject.Add3DChain または X3DObject::Add3DChainChainRoot.AddBone または ChainRoot::AddBone などのメソッドは、ターゲッ位置を使用してボーンを作成しますが、方向を自動的に計算します。確実にボーンを希望の方向にするために、チェインの作成後に別個の手順で明示的にポーズを設定します。

チェインを作成する

チェインを作成する際、各ジョイントの位置はグローバル座標で指定することになります。 最初の 2 つのジョイント位置を、X3DObject.Add2DChain または X3DObject::Add2DChain メソッド、もしくは X3DObject.Add3DChain または X3DObject::Add3DChain メソッドを使って指定し、その後のすべての位置は ChainRoot.AddBone または ChainRoot::AddBone メソッドに指定します。

チェインは個別のオブジェクトから構築されますが、そのエレメントは互いに関係し合っているので、一括でチェイン全体を読み込むほうが 1 ずつエレメントを読み込むより非常に簡単です。X3DObject.Add2DChain または X3DObject::Add2DChain メソッド、もしくは X3DObject.Add3DChain または X3DObject::Add3DChain メソッドを使用してチェインを最初に作成する場合は、2 番目のボーンの根元と先端の両方について位置を指定する必要があります。ボーンを追加するには、ChainRoot または ChainRoot オブジェクトが必要になります(ChainRoot.AddBone または ChainRoot::AddBone メソッドを実装しているのがこのインターフェイスであるため)。チェインエレメントを作成するには少なくとも1つの別のチェインエレメントからのデータが必要なので、チェインは一気に作成するほうがはるかに簡単です。

注:

X3DObject.Add2DChain または X3DObject::Add2DChain の 3 番目と 4 番目の引数は、根元の方向と 2D チェイン平面をコントロールするために使用されます。各エレメントは後で明示的にポーズを設定できるので、デフォルト値を設定するだけでかまいません。

JScript の例: チェインとボーンの作成

NewScene( null, false ); 
 
// Set up vectors for specifying positions, etc. 
var l_oPosRoot = XSIMath.CreateVector3(); // Chain root  
l_oPosRoot.Set( -7.40740740740709E-03, -2.65333293080546, 0 ); 
 
var l_oPosEff = XSIMath.CreateVector3();  // Chain effector  
l_oPosEff.Set( 2.36296296296296, -0.088938533993479, 0 ); 

var l_oNormal = XSIMath.CreateVector3();  // Skeleton plane normal  
l_oNormal.Set( 0, 0, 0 ); 
 
var l_oPosEff_Bone1 = XSIMath.CreateVector3();  // Effector for 2nd bone  
l_oPosEff_Bone1.Set( 2.22222222222221E-02, 2.29757879483154, 0 ); 
 
var l_oPosEff_Bone2 = XSIMath.CreateVector3();  // Effector for 3rd bone  
l_oPosEff_Bone2.Set( 0.466666666666667, 3.54271827074025, 0 ); 
 
 // Create chain 
var l_oChainRoot = ActiveSceneRoot.Add2DChain( l_oPosRoot, l_oPosEff,  
   l_oNormal, si2DChainNormalDegree ); 
var l_oFirstBone = l_oChainRoot.Bones(0); 
 
// Add remaining bones 
l_oChainRoot.AddBone( l_oPosEff_Bone1, siChainBonePin ); 
l_oChainRoot.AddBone( l_oPosEff_Bone2, siChainBonePin ); 

チェインに対してポーズを設定する

チェインにポーズを設定する際に大切なことは、チェインの IK ソルバの発生を防ぐことです。 ボーンまたはエフェクタの位置がコントロールされている間は、常に IK ソルバが発生します。このコントロールには、プロパティ ページでの位置の値の変更、位置によるコンストレイント、位置のエクスプレッション、キネマティクス ノードのスクリプト オペレータなど、可能性として位置の変更が伴う動作も含まれます。SDK で変換を設定する場合でさえ位置のコントロールとみなされるので、その結果生じる IK 評価が原因で、チェインにポーズ データを読み込む際に問題となります。

位置をコントロールしながらポーズを設定すると、チェインの処理内容は IK ソルバによって評価、記述されることになり、設定したばかりのポーズは上書きされてしまいます。 したがって、正しいポーズをチェインに確実に設定するには、チェインの IK ソルバが誘発されることを防がなければなりません。

Softimage バージョン 3.5 またはそれ以前のバージョンでは、IK ソルバの唯一の回避策は、位置のコントロールを避けることでした。 それは、FK(回転)のみでポーズを設定することでした。 チェインは FK でポーズを設定でき、それには Rotate コマンドを使用するか、ローカル変換またはグローバル変換で回転パラメータを設定するかのどちらかの方法を使用します。どちらの方法も位置をコントロールしていないので、IK ソルバがポーズを上書きすることはありません。

しかし、バーション 4.0 以降は、ポーズの設定前に IK ソルバを実際にミュートできるようになっています。

JScript の例: 新しいチェインに対してポーズを設定する

この例は「JScript の例: チェインとボーンの作成」の続きで、チェインのポーズを設定する前に IK ソルバをオフにする方法を示しています。

// Create transform for pose (ie., if you are writing an importer this 
// transform would be provided instead of this one) 
var l_oNewPose = XSIMath.CreateTransform(); 
var l_oMatrix4Rot = XSIMath.CreateMatrix3();
l_oMatrix4Rot.Set( 1.0,1.0,0.0, -1.0,1.0,0.0, 0.0,0.0,-1.0 );
 
// Turn off IK Solver 
var l_oKineChainProp = l_oFirstBone.Properties( "Kinematic Chain" ); 
var l_oMuteOpParam = l_oKineChainProp.Parameters( "muteikop" ); 
l_oMuteOpParam.Value = true; 
 
// Apply the Transform 
l_oNewPose.SetRotationFromMatrix3( l_oMatrix4Rot );


// Turn the IK Solver back on
l_oMuteOpParam.Value = false;