次のシナリオでは、各フレームでソース キャラクタの現在の位置をターゲット キャラクタに投影するために必要なプロセスを示します。
各フレームでリターゲット ソルバを呼び出すときは、元のフォワード キネマティクス アニメーションから派生したソース キャラクタの現在の位置を渡す必要があります。 この現在のスタンスは、初期化段階でソース キャラクタに作成した HIKCharacterState で渡します。
HumanIK には、HIKCharacterState のノードを、ゲーム エンジンのキャラクタのジョイントの現在の FK 位置と向きに同期するために複数のオプションが用意されています。使用可能なすべてのオプションの詳細は、「アニメーション データを設定および取得する」を参照してください。
1 つの一般的な方法は、HIKCharacterState の各ノードに対して HIKSetNodeStateTQSfv() 関数を呼び出すことです。この関数には次の引数が必要です。
HIKSetNodeStateTQSfv (MySrcCharacter, MySrcCharState, RightHandNodeId, myModel.GetTrans(RightHandNodeId), myModel.GetQuatRot(RightHandNodeId), myModel.GetScale(RightHandNodeId)}
インバース キネマティックス ソルバ プロセスは複数の手順に分割され、各手順で、選択されたジョイント チェーンの新しい位置、Pull などのコンストレインの効果、フロア コンタクト(「足および手のコンタクト」を参照)や Squash ’n’ Stretch(「Squash 'n' Stretch を使用する」を参照)など特殊な変形の結果が計算されます。
リターゲット ソルバがインバース キネマティクス ソルバを呼び出すときに実行されるソルバ ステップを判断するには、HIKSetIKSolvingStep() 関数を呼び出します。 この関数は次の 2 つの引数が必要です。
HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepAll);
HIKSolvingStep 列挙値にリストされている複数のソルバ ステップを指定するには、それらの値を | 演算子(ビット単位の OR)で連結する必要があります。例:
HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepBodyPull |
HIKSolvingStepLeftShoulder |
HIKSolvingStepLeftArm |
HIKSolvingStepLeftHand);ターゲット キャラクタに作成した HIKPropertySetState の設定を変更することで、HumanIK のリターゲット ソルバをコントロールすることができます。 たとえば、キャラクタの複数のノードの Reach、Pull、Resist を設定することができます。HIKPropertySetState で利用できる設定オプションと、それらのプロパティの設定方法の詳細については、「キャラクタ プロパティ」と「リターゲットに固有のプロパティ」を参照してください。
ソース キャラクタの HIKPropertySetState は、プロパティ HIKFootBottomToAnkleId を取得するためにのみ使用されます。このプロパティは、インバース キネマティクス ソルバがソース キャラクタの高さをターゲット キャラクタに適合させるために必要です。 足のコンタクト(「足および手のコンタクト」を参照)を使用する場合と、ソース キャラクタとターゲット キャラクタの足首がデフォルトの T スタンスでフロアから同じ距離にない場合にのみ、この設定をソース キャラクタに指定する必要があります。
HumanIK のリターゲット ソルバを起動するには、HIKSolveForCharacter() 関数を呼び出します。 この関数には次の引数が必要です。
HIKSolveForCharacter (MyTargetChar, MyTargetCharState, MySrcChar, MySrcCharState, MyEffectorSet, MyTargetPropertySet, MySrcPropertySet);
リターゲット ソルバは、ターゲット キャラクタに対して生成したポーズを、そのキャラクタに対して引数として渡された HIKCharacterState に格納します。各ノードのトランスレーション、向き、スケールはこの HIKCharacterState で取得し、ゲーム エンジンのキャラクタに適用し直す必要があります。
HumanIK には、HIKCharacterState 内のノードの 3 次元の位置、回転、スケールを取得するための多数のオプションがあります。 使用可能なすべてのオプションの詳細は、「アニメーション データを設定および取得する」を参照してください。
キャラクタに対して計算されたポーズを取得する一般的な方法の 1 つは、HIKCharacterState の各ノードに対して HIKGetNodeStateTQSfv() 関数を呼び出すことです。この関数には次の引数が必要です。
const float trans[4]; const float quatRot[4]; const float scale[4]; HIKGetNodeStateTQSfv (MyCharState, RightHandNodeId, trans, quatRot, scale); ... // apply retrieved values back to game engine here
各ノードに対して取得した値を、ゲーム エンジンのキャラクタの対応するジョイントに再適用するかどうかは、ユーザが決定します。