BLOGブログ

2015.09.04UE4UE/ Animation

[UE4] Foot IK で段差がある地形でも自然なアニメーションを実現する ~基礎編~

こんにちは。ほげたつ(@HogeTatu)です。

今回から連載で Foot IK について書いていきたいと思います。

 

IK とは

アニメーションは基本的にボーンを移動/回転/拡縮させることで実現します。

更にボーンは階層構造となっているため、親ボーンが動くと小ボーンもそれに合わせて動きます。

例えば膝を持ち上げた時、それに合わせて足首も上方向に移動しますよね。

つまり小ボーンの状態は親から受け継がれてきた状態を受けて最終的に決定されるのです。

親の状態を決定し、子の状態を決定し、更にその子の状態を決定し…というアプローチを Forward Kinematics (FK) と呼びます。

 

しかしここで人体を例に考えてみましょう。

何か前方の物を掴もうとする時、肩の位置を決定して、肘の位置を決定して、手首の位置を決定して、指を動かして物を掴む…なんて事をやりますか?

そんな事はまずやらないと思います。

前方の物を掴むときは、物がある場所に合わせて手首の位置を決定し、それによって自動的に肩や肘の位置や回転が決まる、といった流れになりますね。

このようにボーンの目標地点から逆算し、親の位置や回転が自然になるように決めていくアプローチを Inverse Kinematics (IK) と呼びます。

 

Foot IK とは

アニメーターにアニメーションを作ってもらう時、基本的には平面上に存在するという前提で作ってもらいます。

例えば待機時用の二足立ちしているアニメーションの場合、両足の高さは揃えて作ってもらいます。

しかしゲーム中は平面ばかりではありません。

坂があったり、段差があったり、そんな場所で待機すると両足の高さが揃っているばかりに足がめり込んだり浮いたりしてしまいますね。

FootIK_01

こんな時、IKを使ってアニメーションの上からボーン制御をする事で、自然な見た目に近付けることができます。

FootIK_02

 

 

具体的にどうするのか

解決すべき問題は2つあります。

簡単に説明だけ行いますが、詳細な説明と実装は次回以降で紹介していく予定です。

ちなみに C++ は一行も書きません。

 

1. 立っている場所よりも低い位置に足を着こうとすると浮いてしまう

キャラクターが重力がある空間に立っている時、全身を覆うカプセルコリジョンの当たり判定結果から立ち位置を決めています。

つまり何もしなければ、カプセルコリジョンが覆っている空間よりも下に足を伸ばすことができません。

これが浮いてしまう問題の原因です。

逆に言えば、コリジョンとメッシュの位置関係を可変にすることで対応できるということです。

 

2. 立っている場所よりも高い位置に足を着こうとするとめり込んでしまう

めり込みに対しては前述した IK を使用する事で対応できます。

地面に対して当たり判定を行い、当たった場所まで足首を引き上げてあげれば良いのです。

 

終わりに

簡単にですが、Foot IK を使ってやりたいこと、解決すべき問題を紹介しました。

具体的な実装は次回以降で紹介していきます。