2 段階のプロセスでエンベロープを構築する場合、まずはチェインを作成し、次にチェインにポーズを設定します。 このセクションでは、これらの 2 段階の手順について詳しく説明します。
2 段階の手順で作業する理由は、チェインの作成時にルートとボーンの向きを設定することが難しいからです。 X3DObject.Add2DChain または X3DObject::Add2DChain、X3DObject.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 チェイン平面をコントロールするために使用されます。各エレメントは後で明示的にポーズを設定できるので、デフォルト値を設定するだけでかまいません。
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;