エンベロープ

 
 
 

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

2 段階の手順で作業する理由は、チェインの作成時にルートとボーンの向きを設定することが難しいからです。 X3DObject.Add2DChain または X3DObject::Add2DChainX3DObject.Add3DChain または X3DObject::Add3DChain および ChainRoot.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 でポーズを設定することができます。 どちらの方法も位置をコントロールしていないので、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;