今回から、FootIKを作成していきます。

足の下の地面を探る

ThirdPersonCharacterのブループリント内に足の下の地面までの距離を求める関数を作成します。

前準備として、グレイマンの足に座標を求める為の「ソケット」を追加する必要がありますので、まずは、グレイマンのスケルトン(/Mannequin/Character/Mesh/UE4_Mannequin_Skeleton)を開いてください。

そして、グレイマンのスケルトンツリーの”foot_l”の上で右クリックし、”ソケットを追加”を選択し、スケルトンツリーに追加されたソケットに対して、”SocketFootL”という名前を付けてください。

また、右足にも同じ処理を施したいので、foot_rにも同様の作業をしてください。

これで、SocketFootLとSocketFootRという2つのソケットを追加することができました。

上記で追加したソケットという仕組みを使い、足の直下の地面の衝突位置を取得する関数を作っていきます。名前は”IKFootTrace”とし、引数にName型の”FootSocketName”と、Float側の”Distance”を定義しておきます。この関数には左足・右足それぞれ1回ずつ呼び出す事になるので、引数で左足の地面を調べるのか、右足の地面を調べるのかを指定できるようにしておき、地面を調べる為の距離をDistanceで指定しています。

まずは、ざっくりと以下のようにロジックを組んでみてください。GetActocLocationノードはグレイマンの腰あたりの座標を取得します。X・Yは足に付与したソケットの座標を使うので、足のX・Y座標から見て腰から地面(Distanceで指定した距離)までの高さをチェックするという関数になります。(後で解説します)

結果として、ライントレースで何かに衝突したか?を判定し、衝突している場合は、衝突した地面の座標(Z軸を)から本来足のあるべき位置であるMeshの座標(Z軸のみ)を引いた値を足の座標のオフセット値として返却します。何にも衝突していない場合は足を曲げる必要が無いので、0を返却します。

関数を作成したら、グレイマンのイベントグラフにTickイベントを作成し、上記の関数で左足・右足それぞれの処理を呼び出すようにしてみます。Distanceにはとりあえず、適当な値として200を設定しておきました。

早速確認してみましょう。プレイボタンを押してみると・・・

赤いデバッグラインを見ると一目瞭然ですが、グレイマンの腰あたりから、左右の足の直下の地面へ向けてライントレースが走っていることが分かるかと思います。

足の先の可動範囲は腰の下(しゃがんだ状態)から、足の長さ(足を伸ばした状態)までなので、Distanceに正確な値を入れれば、足の可動範囲の全てをライントレースしている事になります。トレースした結果、地面に当たった位置にTwoBoneIKを使って足を移動させてあげれば、FootIKの実装ができそうな感じがしてきました。

アニメーションブループリントでTwoBoneIKを実装してみよう

Tick内のIKFootTrace関数で取得した、左右それぞれのオフセット値をアニメーションブループリントに渡して、TwoBoneIKに渡してみましょう。

まずは、グレイマン(ThirdPersonCharacter)とアニメーションBP(ThirdPerson_AnimBP)の情報受け渡しの為に、ブルーープリントインターフェースを作成します。コンテンツブラウザ内の何もないエリアで右クリックし”ブループリント”から”ブループリントインターフェース”を選択し、”BPI_ThirdPersonFootIK”という名前にします。

作成したら、その中にUpdateFootIK関数を作成します。引数は左右の足のオフセット値を渡せばいいので、Float型でLeftFootOffset/RightFootOffsetとしました。

ThirdPersonCharacterのTick処理でIKFootTrace関数をコールした後に、UpdateFootIKを呼び出すように修正します。インターフェースはアニメーションBPに対して呼び出すので、MeshからGetAnimInstanceノードでアニメーションブループリントを取得しています。

アニメーションBPに移動して、BPI_ThirdPersonFootIKをインターフェースに定義してください。

インターフェースを定義すると、関数欄でオーバーライド定義が可能となるので、UpdateFootIKを選択してください。すると、イベントグラフ内に”イベント UpdateFootIK”というノードが追加されるので、処理を実装していきます。

アニメーションBP内に”IKLeftFootEffector”と”IKRightFootEffector”というFloat型の変数を定義し、UpdateFootIKイベントの引数の値を入れてあげるだけです。これで、グレイマンのTick処理で計算された足の位置が、アニメーションBPに渡ってきます。

最後にアニメーションBPのAnimGraphのTwoBoneIKを実装します。すでに左足のTwoBoneIKノードは実装済みだと思いますので、右足のTwoBoneIKを実装し、ブループリントインターフェースで受け取ったオフセット値をEffectorに入れ込んであるだけです。

一応、TwoBoneIKノードの詳細設定値を改めて表記しておきます。

IKBonefoot_l
EffectorLocationSpaceBone Space
EffectorTargetfoot_l
JointTargetLocationのX(ノード内)30
JointTargetLocationのY(ノード内) 200
JointTargetLocationのZ(ノード内) 40
左足の設定値
IKBonefoot_r
EffectorLocationSpaceBone Space
EffectorTargetfoot_r
JointTargetLocationのX(ノード内) -30
JointTargetLocationのY(ノード内) 200
JointTargetLocationのZ(ノード内) 40
右足の設定値

早速実行してみましょう!!

あ、、、あれ?なんも変わらん・・・

実は、これには理由がありまして、グレイマンに設定されているカプセルコリジョンが原因となっています。

試しに、この状態で@キーを押して、”Show Collision”と入力してみると薄っすらとグレイマンのカプセルコリジョンを見る事ができますが、これが階段に引っかかっていて、地面の位置の判定はできていても、足はそれ以上伸びないので、何も変化が無いという状態になっていました。

なんか面倒な事になってきましたが、解決方法は簡単です。グレイマンのカプセルコリジョンを上に移動させれば良いのです。(正確には、グレイマンのメッシュを下にズラすとも言います)

早速、ThirdPersonCharacterを開き、ビューポートからグレイマンを下に移動させてみましょう。(カプセルコリジョンの底辺がグレイマンの膝の位置になるくらいで良いと思います)

この状態でプレイしてみると・・・

なんか、超短足に見えるグレイマンが登場!しかし、階段や坂道に乗ってみると、FootIKが正常に動作しているように見えます!そもそも、カプセルコリジョンから下側にはみ出したグレイマンがしゃがんだ状態になって足が地面についていること自体がFootIKが正常に動作しているという事になるので、とりあえずFootIKの実装としては成功しました。

しかし、このままではグレイマンが歩き辛そうなので、次回はこの点を修正していきます。

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です