クリーチャーは、「チェーン」と「セクション」という 2 つのベース要素を組み合わせて構成されます。チェーンは手足(または触覚、尻尾、触手、下顎など)、または首や背骨などの 2 つのセクション間をつなぐリンクになります。セクションを持たないクリーチャーを作成することもできます(IK をそのボディ全体ではなく、手足にのみ実行する場合)。セクションは中枢的なボディ パーツです。それらはいくつかのチェーンの接合点と考えることができます。チェーンは完全に伸びた状態に達するとセクションを引き寄せる場合があります(「FullBodyIK」と呼ばれます)。
HumanIK は、各チェーンに対して 1 つのエフェクタを自動的に作成し、それをチェーンの末端に配置します(中間エフェクタはありません)。このエフェクタは、このチェーンを使用して到達したターゲットの位置と方向を定義します。
HumanIK はまた、各セクションに対して 1 つのエフェクタを作成します。このエフェクタは、このセクションを使用して到達したターゲットの位置と方向を定義します。
コードを作成する前に、チェーンとセクションを使ってクリーチャーの略図を書くことをお勧めします。サンプルに含まれているクリーチャーの略図を以下に示します。

通常、同じクリーチャーを実装するのにさまざまなオプションがあります。クリーチャーのどの部分をアニメートするか、どのようにアニメートするかに応じて、いろいろな組み合わせを選択して変化を付けることができます。次の図は、サンプルのクリーチャーのアニメーションをコントロールするために自動的に作成されるエフェクタを示しています。

略図を書き終えたら、実際のチェーンのソルバ タイプを選択します。計算する付属器官のタイプ、期待する品質、CPU の制約などにもよりますが、1 つのチェーンのソルバ タイプを全体に適用すると良いでしょう。クリーチャーの 3D モデルに存在するジョイントの実際の数がこの選択に影響を与えることはありません。HumanIK に対してすべてのスケルトン ジョイントを宣言する必要はありません。スケルトン ジョイントのいくつかをスキップしても構いません。これはパフォーマンスを向上させる効果があります。たとえば、5 つのジョイントを持つ脚に TwoBoneIK Chain ソルバをアタッチしても構いません。また、LOD の方法を実装するために、チェーンの計算時間を実行中に変更することもできます。チェーンのソルバ タイプを確定的に定義する必要はありません。
次の図は、サンプルのクリーチャーに対して選択されているチェーンのソルバ タイプを示しています。

現在は、クリーチャー ソルバに実装されているチェーンには 5 つのタイプがあります。
#define NB_LIZARD_CHAINS 5 // 4 legs and 1 tail HIKCreatureDefinition lDefinition; memset(&lDefinition, 0, sizeof(HIKCreatureDefinition)); HIKCreatureChainDefinition * lChainDefinitions = new HIKCreatureChainDefinition[NB_LIZARD_CHAINS]; lDefinition.mNbChains = NB_LIZARD_CHAINS; lDefinition.mChains = lChainDefinitions; lDefinition.mHasParentOffset = false; lDefinition.mHasLimits = false; HIKCreatureSectionDefinition * lSectionDefinitions = NULL; lSectionDefinitions = new HIKCreatureSectionDefinition[1]; lDefinition.mNbSections = 1; lDefinition.mSections = lSectionDefinitions;
for(int i=0; i<NB_LIZARD_CHAINS; i++)
{
switch(i)
{
case LIZARD_CHAIN_FRONT_LEG_L :
case LIZARD_CHAIN_FRONT_LEG_R :
lChainDefinitions[i].mNbNodes = 4; // 4 joints for the back legs
break;
case LIZARD_CHAIN_BACK_LEG_L :
case LIZARD_CHAIN_BACK_LEG_R :
lChainDefinitions[i].mNbNodes = 3; // 3 joints for the back legs
break;
default:
lChainDefinitions[i].mNbNodes = 6; // 6 joints for the tail
break;
}
lChainDefinitions[i].mSection = 0; // All Chains are attached to Section 0
lChainDefinitions[i].mNbParentOffsets = 0;
lChainDefinitions[i].mNbLimits = 0;
}
lSectionDefinitions[0].mParentChain = -1; mHIKCreature = HIKCreatureCreate(&lDefinition, &malloc, "LicenseHere!!!"); if(mHIKCreature == NULL) return false;
コードをさらに記述する前に、Verbose ビルドに対して構築されたアプリケーションを使って、ここまでのコードの実行を試す必要があります。これにより、エラーをモニタするためのログ ファイル (humaniklog.txt) が生成されます。クリーチャー ソルバはキャラクタ ソルバよりもはるかに詳細なレポートを出力します。
HIKCreatureSetCharacterizeNodeStateTQSfv(
mHIKCreature,
lLizardProfile->mBoneMapping[i].mChainID,
lLizardProfile->mBoneMapping[i].mBoneID,
jointTranslation, jointOrientation, jointScale);
bool result = HIKCreatureCharacterizeGeometry(mHIKCreature);
if(res == false)
{
// Something is wrong. Check your log.
}
// Set Chain types HIKCreatureSetChainSolvingType(mHIKCreature, LIZARD_CHAIN_TAIL, HIKChainSolvingTypeTentacleApprox); HIKCreatureSetChainSolvingType(mHIKCreature, LIZARD_CHAIN_FRONT_LEG_L, HIKChainSolvingTypeCoplanar); HIKCreatureSetChainSolvingType(mHIKCreature, LIZARD_CHAIN_FRONT_LEG_R, HIKChainSolvingTypeCoplanar); HIKCreatureSetChainSolvingType(mHIKCreature, LIZARD_CHAIN_BACK_LEG_L, HIKChainSolvingTypeCoplanar); HIKCreatureSetChainSolvingType(mHIKCreature, LIZARD_CHAIN_BACK_LEG_R, HIKChainSolvingTypeCoplanar); // Add stiffness to front leg chains HIKCreatureSetChainStiffness(mHIKCreature, LIZARD_CHAIN_FRONT_LEG_L, 0.75f); HIKCreatureSetChainStiffness(mHIKCreature, LIZARD_CHAIN_FRONT_LEG_R, 0.75f); // No stiffness at all for the tail HIKCreatureSetChainStiffness(mHIKCreature, LIZARD_CHAIN_TAIL, 0.0f);
ソルバに FullBodyIK の pull と torque を計算させるかどうかを指定することができます。 これらの機能を有効にすると結果を向上させることができますが、CPU の負担が増えます。次の関数を使うことにより、pull と torque の計算をいつでも有効化/無効化できます(たとえば、クリーチャーがカメラに近づいたときにだけ有効にすることができます)。
// Enable both pull and torque HIKCreatureEnableFBIK(mHIKEffectorSetState, true); HIKCreatureEnableTorque(mHIKEffectorSetState, true);