Unityに組み込まれているIKでは不十分な場合があります。Unity用の独自のIKスクリプトを作成する方法を紹介します。このIKは、指、手、足などの関節のあるボディに適用できます。私がレビューするIKは現在、Unity、Unreal、Panda、およびその他のいくつかのゲームエンジンで使用されています。それはFABRIKと呼ばれています。
FABRIKは反復法です。反復法とは、すぐに解を得られない方法です。反復メソッドは、メソッドの反復回数が増えるほど、つまりループの反復回数が増えるほど、正しい解に近づきます。
任意のIK問題には、指定された関節ボディ(長さと角度を持つ一連の接続された四肢)があります。エンドエフェクタ(最終的な四肢の端点の位置)には、ゴール位置を持つ開始位置があります。角度などの他の目標があるかもしれません。
各FABRIK反復には2つの主要部分があります。
void FABRIK() {
while( abs(endEffectorPosition — goalPosition) > EPS ) {
FinalToRoot(); // PartOne
RootToFinal(); // PartTwo
}
}
最初の部分は、最後の手足からルートの手足まで繰り返されます。最後の手足については、手足の角度/回転を変更して、ゴール位置を指すようにする必要があります(内側の位置を固定したまま、角度の変更によって外側の位置を平行移動させます)。次に、四肢の外側位置がゴール位置と等しくなるまで(角度は維持するが四肢の内側位置を変更させる)、最終的な四肢を更新された角度に沿ってゴール位置に向けて移動します。現在の目標位置を更新する必要があることを除いて、最終リムについてはこれでおしまいです。現在の目標位置は、最終的な肢の更新された船内位置に設定されています。
連続する内側のリムのそれぞれについて、同じことを行います。明確にするために、その概要を説明します。現在の手足の場合、現在の目標位置を指すように手足の角度/回転を変更する必要があります。次に、手足の外側位置が現在の目標位置と等しくなるまで、現在の手足を更新された角度に沿って現在の目標位置に向かって移動します。最後に、現在の目標位置を更新して、現在の四肢の内側の位置を更新します。
根の手足でこれらの操作が完了するまで、これらの操作を繰り返します。その後、最初のパートが完成しました。
/* Part One */
void FinalToRoot() {
currentGoal = goalPosition;
currentLimb = finalLimb;
while (currentLimb != NULL) {
currentLimb.rotation = RotFromTo(Vector.UP,
currentGoal — currentLimb.inboardPosition);
currentGoal = currentLimb.inboardPosition;
currentLimb = currentLimb->inboardLimb;
}
}
2番目の部分は、逆方向に反復します。ルートリムから最後のリムまでです。ルートリムについては、その内側位置をルート位置に更新する必要があります。これにより、四肢全体が(ストレッチなしで)変換されます。現在の船内位置を更新する必要があることを除いて、ルートリムについてはこれでおしまいです。現在の内側の位置は、ルートリムの更新された外側の位置に設定されています。連続する船外リムごとに、同じことを行います。明確にするために、その概要を説明します。現在のリムについて、その内側位置を現在の内側位置に更新する必要があります。これにより、四肢全体が変換されます。現在のリムについては、これでほぼ完了です。ただし、現在の船内位置を更新する必要があります。現在の内側位置は、現在の四肢の更新された外側位置に設定されています。
最後のリムでこれらの操作が完了するまで、これらの操作を繰り返します。その後、後編は完成です。
/* Part Two */
void RootToFinal() {
currentInboardPosition = rootLimb.inboardPosition;
currentLimb = rootLimb;
while (currentLimb != NULL) {
currentLimb.inboardPosition = currentInboardPosition;
currentInboardPosition = currentLimb.outboardPosition;
currentLimb = currentLimb->inboardLimb;
}
}
最初の部分と2番目の部分が完了すると、FABRIKメソッドの最初の反復が完了します。エンドエフェクターが、EPS(イプシロン値)で定義された目標位置に必要なだけ近づくまで、パート1とパート2を繰り返します。
それでおしまい!それがFABRIK法です。パート1は最後の手足から後方に反復します。パート2は、ルートリムから前方に反復します。FABRIKメソッドは、エンドエフェクタがゴールの位置に十分近くなるまでパート1とパート2を繰り返します。