前回までにFootIKの大まかな実装は完了しましたが、グレイマンが歩き辛そうになってしまったので、それを解決していきます。
カプセルコリジョンを元に戻したい
カプセルコリジョンを上にあげることでFootIKを強制的に動かしていましたが、このままだと色々な当たり判定とか面倒になってきそうです。しかも、グレイマンも歩き辛そうなので、元に戻して下ましょう。

でも、そうなるとFootIKが正常に動作しなくなってしまいました。どうしましょう・・・
これを解決するには、アニメーションBPのAnimGraphにある”ボーンをトランスフォーム(修正)する”というノードを使用します。このノードは簡単に言えば、アニメーションしているボーンの位置を移動させたり、回転させたり、拡大縮小させたりすることが出来るノードで、今回はこれを使って、FootIKが動作して欲しい時はボーンを下側にずらして、足の部分をカプセルコリジョンから出してあげるようにします。
“ボーンをトランスフォームする”は、こんな感じのノードになります。今回はグレイマン全体を上下移動させたいので、Bone to Modifyには”pelvis”を選択しておき、TranslationModeには”Add to Existing”を設定しておきます。下図のように、TranslationZに10を入れて、ノードを接続してあげれば、グレイマンは10だけ上側に移動します。今回はカプセルコリジョンの下側に足を出させたいので、Z軸のマイナス方向に移動させますが、こんな感じのノードがあることを理解しておいてください。

さて、問題はどれだけZ軸を移動させるかという点です。
まず前提条件として、FootIKを使って膝を曲げる際に、両方の膝が曲がる事はありません。両方の膝が曲がるのであれば、それは直立している事と何ら変わらないからです。
そして、足は足の長さ以上には伸びないという条件もあります。言葉にすると当たり前ですが、これも重要な点となります。
つまり、上記を条件から必要なZ軸の移動量を求めると、左右どちらかの足が曲がっている時に、伸びている側の足の長さ分だけZ軸をずらしてあげれば良いという結論になります。
早速実装してみましょう。
左足・右足のそれぞれのオフセット値が取得できたら、オフセット値が小さいほう(つまり、TwoBoneIKによって影響を受けていない方)が伸びている足という事になる為、それぞれのオフセット値の小さい方を取得してブループリントインターフェースに新たに追加したPelvisOffsetに渡します。

前述の通りです、BPI_ThirdPersonFootIKのUpdateFootIKにPelvisOffset(float値)を追加しました。

アニメーションBPのイベントグラフ側で、PelvisOffsetを取得し、変数(新たにIKPelvisOffsetをfloat型で作成しておきます)に渡します。

IKPelvisOffsetをAnimGraphの”ボーンをトランスフォーム(修正)する”ノードに渡します。

実行してみると、足が地面に埋まってしまいます。
これは、TwoBoneIKで動かした足の対して、グレイマン全体をZ軸の下方向に移動させている為、足がめり込んでいしまっているのです。対策として、アニメーションBPのイベントグラフ内で下方向に移動させる分だけ足のオフセット値も調整してあげれば良さそうなので、修正します。

プレイを押してみると、なんか雑な動き感はありますが、FootIKが正常に動作している事が分かります。
ちょっと気になる点としては、駆け足で階段を上ると、必要以上にグレイマンが腰を低くしてしまう点と、動きのぎこちなさでしょうか?
グレイマンが必要以上に腰を低くする不具合については、誤魔化しでの対応となりますが、PelvisOffset値をある一定以上は動かさないように制限をかければ良さそうなので、修正します。色々パラメータを調整した結果、PelvisOffsetが-45以下になると腰を低くしすぎているように見えたので、制限をかけていいきます。

次に動きのぎこちなさを解消していきます。これにはFInterpToというノード(値をなめらかに変化させてくれる)がありますので、それを利用していきます。今までは、IKFootTraceで取得した結果をそのままUpdateFootIKに渡していましたが、FInterpToノードを使う場合は一旦変数に落とし込む必要があるので、変数を作成し、値を格納していきます。

最後に、IKFootTraceのDistanceに200を渡していた箇所ですが、これも正確な値にしていきましょう。
ここに入れる値は、腰から下方向に地面をチェックするトレースの長さになるので、腰から足の距離+スケルトンを全体的に下に移動させた場合の最大の足の曲げ量ということで、カプセルコンポーネントの高さ分としました。

最後に確認してみましょう。
良い感じになりました。ライントレースのデバッグ表示を非表示にすれば、完璧でした。。。

これで、FootIKの説明は終了となります。TwoBoneIKノードをいかに使いこなすかがキモとなりますので、色々な事にチャレンジしてみてください。
次回は、IKの特別編でHandIKに挑戦していきます!
No responses yet