追加ジョイントをサポートする

キャラクタのスケルトンに、HumanIK 内のサポートされているノードのリストで直接マッピングされないジョイントが 1 つ以上ある場合、少なくとも HumanIK で必要なノードがすべてキャラクタに含まれていれば、HumanIK を使用してキャラクタを制御することもできます。キャラクタには、任意の数のこのような不明な追加ジョイントを含めることができます。ただし、HumanIK ソルバは、Biped および Quadroped のスケルトン構造の事前定義がされたジョイントをビルトイン情報を元に計算をします。キャラクタのジョイントが HumanIK の認識するジョイントの範囲外の場合、このソルバはサポートされていないジョイントを直接移動または回転することができません。

これの結果は、HumanIK とゲーム エンジンの間のアニメーション データの変換に、グローバル スペースを使用するか、ローカル スペースを使用するかによります。

グローバル スペースを使用する

グローバル スペースを使用して HumanIK とゲーム エンジンの間でアニメーション データを変換する場合、認識するノード(すなわち、HIKNodeId 列挙値に表示されているノード)に対してHumanIK ソルバによって計算される位置および回転を利用することと、これらの値に基づいて追加の不明なジョイントの新しい位置および回転を計算することにより、追加の不明なジョイントをサポートすることができます。

ローカル スペースを使用する

ローカル スペースでは、ノードのトランスレーション、向き、およびスケール データが親ノードと比較して表現されます。HumanIK は、正規化されたグローバル スペース内部で機能しますが、データ セットの使用時にローカル スペースの変換を使用して、HIKCharacterState でノードのトランスレーション、回転、およびスケールを設定または取得することができます。詳細は、「HIKCharacterState データのデータ セット関数」を参照してください。

キャラクタのスケルトンに HumanIK に対する不明なジョイントが含まれている場合、これらの不明なジョイントのトランスレーションおよび回転は、そのスケルトンの子ジョイントのローカル スペースに影響を及ぼします。たとえば、キャラクタが肩と肘の間に余分な腕ジョイントを持つロボットである場合、その余分なジョイントの回転は、肘ノードの位置および回転に影響を及ぼします(手首ノード、手ノード、および手の指すべてのグローバルの位置および向きに順に影響を及ぼします)。

不明なジョイントがジョイント チェーンの最後にある場合、HumanIK ソルバによって生成される HIKCharacterState をローカル スペースの変換を使用するゲームのキャラクタに戻して適用することにより、単純に透過的にサポートすることができる場合があります。たとえば、HumanIK に対して不明な、一連のテール ジョイントを持つキャラクタを考えます。これの最終的な親は HumanIK ウエスト ノードです。HumanIK ソルバがウエスト ノードを移動または回転する場合、ウエスト ノードのローカル スペースの変換をゲームのキャラクタに戻して適用することにより、HumanIK によって直接制御されなくても、テールはウエスト ノードに沿って移動および回転することができる可能性があります。

ただし、不明なジョイントが、上に書かれているような余分な肘のあるロボットなど、2 つの HumanIK ジョイントの間にある場合は、不明なジョイントの子である HumanIK ノードのペアレント オフセットを定義する必要があります。このペアレント オフセットは、ノードのローカル回転、トランスレーション、およびスケールに関する、不明な親ジョイントの効果を定義します。たとえば、上で紹介されているシナリオを続けるには、ロボットの肘ジョイントは、ペアレント オフセットが定義されている必要があります。ペアレント オフセットの回転、トランスレーション、およびスケールは、スケルトンの階層で肘のすぐ上の余分なジョイントのローカル スペースに一致します。このペアレント オフセットに対して設定するトランスレーション、回転、およびスケール値は、スケルトンの階層で不明なジョイントからすぐ上の HumanIK ジョイントと比較して定義される必要があります。

手順 1: HIKCharacterDefinition をセットアップする

ノードのペアレント オフセットを設定するには、まず HIKCharacterDefinition で初期化時に、ノードに不明な親があることを示す必要があります。希望する各ノードに対応する mUsedNode 要素の値を HIKNodeParentOffset に設定します。この結果、HumanIK により、指定されたノードのペアレント オフセットを格納するための追加メモリが、HIKCharacterDefinition から作成された各 HIKCharacter に割り当てられます。詳細は、「初期化」を参照してください。

これは、Degrees of Freedom が割り当てられていないノードの場合のみ必要であることに注意してください。mUsedNode 要素の値を設定することにより、ノードの Degrees of Freedom を HIKNodeLimits に割り当てると、自動的にペアレント オフセットのメモリが割り当てられます。詳細は、「Degrees of Freedom 」を参照してください。

手順 2: HIKCharacter をセットアップする

ノードのペアレント オフセットは、HIKCharacter で保持されます。オフセットが変更された場合(余分なジョイントが拡張または圧縮する、自身の親と比較して異なるトランスレーションを実行するなど)、ペアレント オフセットを更新する必要があります。これにより、スケルトンの階層でペアレント オフセットの下にあるすべての HumanIK ノードが移動されます。

HumanIK に対して不明な親ジョイントを含むノードのペアレント オフセットを設定するには、HIKSetParentOffsetfv() 関数を呼び出します。この関数によって求められるパラメータの詳細については、『API Reference』を参照してください。

例:

HIKSetParentOffsetfv(MyHIKCharacter, RightElbowNodeId,
                                     lParentTOffset.mData,
                                     lParentQOffset.mData,
                                     lParentSOffset.mData);