次の場合には、HumanIK を使用して Biped をコントロールするのとまったく同じ方法で Quadruped の動きをコントロールできます。
キャラクタの Quadruped ソルビングを明示的に有効にする必要はありません。キャラクタライゼーションの違いをのぞけば、Biped キャラクタに行う手順とまったく同じ手順を使用して、Quadruped キャラクタに対する IK ソルバの実行やアニメーションのリターゲットを行います。
生体力学の観点からは、Quadruped に対する HumanIK IK ソルバの結果は通常 Biped に対する結果ほど正確にはなりません。ただし、それでもソルバは最小限の FK アニメーション ライブラリ(単独の歩行アニメーションと単独のアイドル アニメーションのみ)を基にして現実にいそうなさまざまな四足動物をゲーム環境に発生させ、十分にリアルな結果を生成することができるはずです。HumanIK API によって提供されるすべてのダイナミック IK コントロールを使用して、これらの基本アニメーションの上に追加の動的な動作を重ねることができます。たとえば、フロア コンタクト システムを使用してローカル ジオメトリに適応することや、LookAt コントローラを使用して動物の頭と上半身を回すことができます。
リアルな Quadruped を設定することは簡単ではありません。Quadruped と Quadruped のキャラクタライゼーションの要件に関する質問がある場合には、オートデスクのサポートまでご連絡ください。お使いの四足動物のうち、特定のものが適切にキャラクタライズできない場合には、詳細と共にオートデスクのサポートにご連絡ください。モデルまたはそのスケルトンを含む FBX ファイルがあれば理想的です。エンジニアが喜んでお手伝い致します。「サポート」を参照してください。
このリリースには、HumanIK で使用するためにいくつかの異なるタイプの Quadruped を設定する方法を示す、実用的なコード サンプルが含まれています。スケルトンの構造が異なるため、各タイプのキャラクタライゼーション要件は若干異なります。

HumanIK サンプルのビルドと使用の詳細については、「 HumanIK のサンプル」を参照してください。
独自の Quadruped キャラクタを設定する前に、このサンプルのコードに目を通してさまざまな動物がどのように設定されアニメートされているかを理解し、Quadruped のサンプルを実際に使用して、キャラクタライゼーションの違いにより異なる IK ソリューションが生成される様子を確認することを強くお勧めします。
Quadruped のキャラクタライゼーション ワークフローは Biped と同じです。「初期化」で説明したように、Quadruped のキャラクタライゼーションはプログラムで設定するか、視覚的に設定することができます。
現実の世界の四肢動物の骨格は通常、人間の骨格とはまったく異なります。別の種の四肢動物とさえまったく異なります。次のサブセクションにまとめられているように、キャラクタライゼーションを設定するとき、特にキャラクタのスケルトンのジョイントと HumanIK ソルバによって認識されるノード間のマッピングを選択するときは、これらの違いを考慮しなければなりません。
また、馬、キリン、犬や狼などのイヌ科の動物、インパラなどのレイヨウといった、特定の種のキャラクタライズに関する詳細な推奨事項については、このセクションのその他のトピックを参照してください。
通常は、HumanIK ライブラリの Verbose ビルドを使用してキャラクタライゼーションをチェックすることをお勧めします。このビルドはキャラクタライゼーションを検証し、Quadruped の四肢が特定の軸に対して適切に位置合わせされていない場合や脊椎が垂直軸に十分近くない場合など、キャラクタライゼーションが無効のときには役に立つヒントと診断情報を提供するためです。キャラクタライゼーションが条件を満たしていることが Verbose ビルドで示されるまでは、IK ソルバを使用しないでください。詳細については、「デバッグ メッセージをログに記録する」を参照してください。
Quadruped のキャラクタを使用する前には、Biped のキャラクタで使用しているものと同じようなニュートラル スタンスで各ノードの位置と回転を渡して、そのジオメトリをキャラクタライズしなければなりません。詳細は、「概要」を参照してください。このスタンスは Quadruped には明らかに不自然で受け入れがたいですが、HumanIK にキャラクタのスケルトン構造とそのボディ パーツの寸法を提供するために、このようにキャラクタを設定しなければなりません。
次のイメージは、同等のキャラクタライゼーションを示しており、左側が MotionBuilder で作成したもの、右側が C++ のプログラムで作成したものです。
次の Quadruped のニュートラル スタンスの要件は、種やキャラクタライゼーションの作成方法に関わらず同じです。
キャラクタライゼーションの作成方法に応じて、前脚には軸方向について異なる要件があります。
ジョイントのロール回転に注意してください。肘が X 軸を囲むように折り曲がり、キャラクタの背中に向いていることが重要です。肘のジョイントを曲げたときに、前脚が(Y、Z)平面からそれないようにしなければなりません。前脚がこのように設定されていない場合、IK ソルバが動物の脚を横向きに折り曲げることがあります。
蹄の前部または足のつま先が前(Z 軸の正の方向)を向いていなければなりません。蹄または足の裏が完全に水平である必要があります。
ジョイントのロール回転に注意してください。肘が Y 軸を囲むように折り曲がり、キャラクタの背中に向いていることが重要です。肘のジョイントを曲げたときに、前脚が(X、Z)平面からそれないようにしなければなりません。前脚がこのように設定されていない場合、IK ソルバが動物の脚を横向きに折り曲げることがあります。
蹄の前部または足のつま先が前(Z 軸の正の方向)または真上(Y 軸の正の方向)を向いていなければなりません。最適なフロア コンタクトの結果を得るには、蹄または足の裏が完全に垂直である必要があります。
キャラクタのスケルトン内のボーンのマッピングは大半が比較的単純で、一般的な Biped 用のボーン マッピングに似ています。
ただし、後脚と前脚用に、2 つの重要なマッピング オプションがあります。これらのオプションは脚チェーンのジョイントに対して異なる柔軟性を生じさせ、キャラクタのアニメーションおよびスキニングの動作に影響を与えることができます。どちらのオプションを選択するかは、アニメートしている種の特徴と、得られる結果の品質によって決定します。両方の手法を試してから最適な結果を生成する手法を選択してもよいでしょう。
このアプローチを選択する場合、通常は脚の最後のジョイント(すなわち、蹄の裏の方向をコントロールするジョイント)を LeftFootNodeId および RightFootNodeId にマップします。この最後のノードの直前のジョイントは LeftAnkleNodeId および RightAnkleNodeId にマップする必要があります。
HumanIK に組み込まれているデフォルトのフロア コンタクト エンジンを使用して、Quadruped の蹄または足の位置と回転を地形に合わせて調整することができます。組み込みのフロア コンタクト システムの詳細については、「足および手のコンタクト」を参照してください。
ほとんどの場合、Quadruped の手と足の両方に対して「hoof」のコンタクト タイプを使用します。例:
HIKSetPropertyValue(props, HIKHandContactTypeId, 3); // Hoof contact type HIKSetPropertyValue(props, HIKFootContactTypeId, 3); // Hoof contact type
組み込みのフロア コンタクト システムは比較的すぐに設定することができ、比較的 CPU の消費量が小さく、ほとんどの用途に十分な品質の結果を生成します。ただし、キャラクタの四肢を構成するノードの位置を変更することのみが可能です。地表面の位置に応じてキャラクタの胸または腰も調整すると、最終的なポーズのリアリティが向上する場合があります。たとえば、HumanIK に付属の Quadrupeds サンプルでは、ボディ全体がフロアの位置変更と連動するようにいくぶんかの Reach T および Reach R を足と胸に適用しています。これにより多少の CPU リソースが追加で消費されますが、より優れた見た目の結果を得るために、行うだけの価値はあるかもしれません。
Biped のキャラクタで、キャラクタをニュートラルの開始位置にしたいときはいつでも、HIKGetDefaultState() 関数を呼び出してデフォルトのスタンスを取得し使用することができます。ただし、この T スタンスは一般に Quadruped のニュートラル ポーズではあまり有効ではないため、HumanIK では HIKAddQuadripedOffset() 関数を提供しています。これは、T スタンスを Quadruped に適切なニュートラル ポーズに変換するために複数のノードの回転を自動的にオフセットするものです。
HIKCharacterState * MyQuadrupedState = HIKCharacterStateCreate(MyQuadrupedChar, &malloc); HIKGetDefaultState(MyQuadrupedChar, MyQuadrupedState); HIKAddQuadripedOffset(MyQuadrupedChar, MyQuadrupedState);
この関数で各軸に対する正確なオフセットの適用については、関数の説明を参照してください。
また、これらのオフセットの HIKCharacterState への追加を、HIKSubQuadripedOffset() 関数を呼び出すことで元に戻すことができます。