リターゲットのソルビング

次のシナリオでは、各フレームでソース キャラクタの現在の位置をターゲット キャラクタに投影するために必要なプロセスを示します。

手順 1. ソースの HIKCharacterState を更新する

各フレームでリターゲット ソルバを呼び出すときは、元のフォワード キネマティクス アニメーションから派生したソース キャラクタの現在の位置を渡す必要があります。 この現在のスタンスは、初期化段階でソース キャラクタに作成した HIKCharacterState で渡します。

HumanIK には、HIKCharacterState のノードを、ゲーム エンジンのキャラクタのジョイントの現在の FK 位置と向きに同期するために複数のオプションが用意されています。使用可能なすべてのオプションの詳細は、「アニメーション データを設定および取得する」を参照してください。

1 つの一般的な方法は、HIKCharacterState の各ノードに対して HIKSetNodeStateTQSfv() 関数を呼び出すことです。この関数には次の引数が必要です。

例:

HIKSetNodeStateTQSfv (MySrcCharacter, MySrcCharState, RightHandNodeId,
                                                      myModel.GetTrans(RightHandNodeId),
                                                      myModel.GetQuatRot(RightHandNodeId),
                                                      myModel.GetScale(RightHandNodeId)}

手順 2. IK ソルビング ステップを設定する

インバース キネマティックス ソルバ プロセスは複数の手順に分割され、各手順で、選択されたジョイント チェーンの新しい位置、Pull などのコンストレインの効果、フロア コンタクト(「足および手のコンタクト」を参照)や Squash ’n’ Stretch(「Squash 'n' Stretch を使用する」を参照)など特殊な変形の結果が計算されます。

リターゲット ソルバがインバース キネマティクス ソルバを呼び出すときに実行されるソルバ ステップを判断するには、HIKSetIKSolvingStep() 関数を呼び出します。 この関数は次の 2 つの引数が必要です。

例:

HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepAll);

HIKSolvingStep 列挙値にリストされている複数のソルバ ステップを指定するには、それらの値を | 演算子(ビット単位の OR)で連結する必要があります。例:

HIKSetIKSolvingStep (MyEffectorState, HIKSolvingStepBodyPull |
                                      HIKSolvingStepLeftShoulder |
                                      HIKSolvingStepLeftArm |
                                      HIKSolvingStepLeftHand);

また、ソルバ ステップを 0 に設定して IK 解析パスを効果的にスキップすることもできます。

手順 3. ターゲット キャラクタのプロパティを設定する

ターゲット キャラクタに作成した HIKPropertySetState の設定を変更することで、HumanIK のリターゲット ソルバをコントロールすることができます。 たとえば、キャラクタの複数のノードの Reach、Pull、Resist を設定することができます。HIKPropertySetState で利用できる設定オプションと、それらのプロパティの設定方法の詳細については、「キャラクタ プロパティ」と「リターゲットに固有のプロパティ」を参照してください。

ソース キャラクタの HIKPropertySetState は、プロパティ HIKFootBottomToAnkleId を取得するためにのみ使用されます。このプロパティは、インバース キネマティクス ソルバがソース キャラクタの高さをターゲット キャラクタに適合させるために必要です。 足のコンタクト(「足および手のコンタクト」を参照)を使用する場合と、ソース キャラクタとターゲット キャラクタの足首がデフォルトの T スタンスでフロアから同じ距離にない場合にのみ、この設定をソース キャラクタに指定する必要があります。

手順 4. ソルバを起動する

HumanIK のリターゲット ソルバを起動するには、HIKSolveForCharacter() 関数を呼び出します。 この関数には次の引数が必要です。

例:

HIKSolveForCharacter (MyTargetChar, MyTargetCharState, MySrcChar, MySrcCharState, 
MyEffectorSet, MyTargetPropertySet, MySrcPropertySet);

リターゲット ソルバは次のように処理を進めます。

  1. ソース キャラクタの HIKCharacterState 内にあるすべてのノードの方向を、ターゲット キャラクタの HIKCharacterState にコピーします。
  2. 指定された HIKEffectorSetState を設定します。 この手順の主な内容は、各エフェクタの Reach、Pull、Resist の値を、ターゲット キャラクタの HIKPropertySetState 内の Reach、Pull、Resist のキャラクタ プロパティの値に一致するように設定することです。詳細は、「リターゲットに固有のプロパティ」を参照してください。
  3. インバース キネマティクス ソルバを呼び出して、ターゲット キャラクタの HIKCharacterState で IK パスを実行します。このパスにより、ターゲット キャラクタの HIKPropertySetState に最初に指定した Reach、Pull、Resist の設定が適用され、フロア コンタクトなどの追加の特殊効果が実行されます。

手順 5. ターゲットの HIKCharacterState を取得する

リターゲット ソルバは、ターゲット キャラクタに対して生成したポーズを、そのキャラクタに対して引数として渡された 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 

各ノードに対して取得した値を、ゲーム エンジンのキャラクタの対応するジョイントに再適用するかどうかは、ユーザが決定します。