皆様いかがお過ごしでしょうか。歌乃です。

最近またUEを触り始めましたが、色々変わっていて正直手探り状態です(´・ω・`)

今回は UE5 で 取り込んだ VRM のIKボーンが動いてくれない問題の対応に関する記事です。
ついでに以前書いた接地の問題Rootボーンが動いてしまうInPlace問題も解決できました。

以下のような読者を対象にしてます。

  • UEの基本操作がわかり、BluePrintで簡単な処理を作れる。またはBPのサンプルを触ったことがある。
  • VRMファイルの用意ができる(VRoid Studioで出力など)。
  • スケルトンやボーン、リグ、メッシュなど3Dアニメーションに関わる用語や仕組みがある程度わかる。

前回の記事 > UE5 に取り込んだVRMでフェイスアニメーション(モーフターゲット)



今回の問題

今回の問題ですが、取り込んだ VRM のアニメーションでIKボーンがうまく機能していないという問題に関するものです。
具体的にどういった状態かというと、

接地がおかしい

これの何がダメかっていうと、片足が宙に浮いちゃってるとこです。たまにこういった状態のゲームキャラって見かけますよね。
本来のMannequinモデルであれば、

本来のMannequinモデル

こんな感じでちゃんと地形に合わせて接地します。

取り込んだVRMのこの挙動の原因ですが、リターゲティング時にIKボーンが無い、またはIKボーンはあるけど、リターゲティングされないことが原因のようです。
正確にはサンプルのサードパーソンプロジェクトで使用されている「コントロールリグ」がVRMのリグ(ボーン)に対応していないことが原因です。



IKボーン付きVRMの取り込み

まずはIKボーンが無い事への対処ですが、VRMインポート時に設定でIKボーンを生成してくれる機能があります

IKボーンを生成

VRMインポート時の設定画面で「詳細設定」内の項目「Generate IK Bone」にチェックを入れてインポートします。

取り込まれたVRMのスケルトンやスケルタルメッシュを開けばスケルトンツリーからIKボーンが追加されているのが確認できます。

IKボーンが追加されているのが確認できます

追加されるIKボーンは

  • ik_foot_root
  • ik_foot_l
  • ik_foot_r
  • ik_hand_root
  • ik_hand_gun
  • ik_hand_l
  • ik_hand_r

です(プラグインのバージョンによっては今後変更になる可能性があります)。



さて、問題のIKボーンの動きですがそのままリターゲッタを使って取り込むと、

問題のIKボーンの動き

こんな感じで、IKボーンはアニメーションに追随せずそのままです。

期待するIKボーンの動きですが、サンプルのサードパーソンプロジェクトのMannequinのアニメーションを再生すると、

期待するIKボーンの動き

足の動きに合わせてIKボーンも動いています。こうなってほしい ( ゚д゚)



Free Bone Snapper

いろいろと試行錯誤した結果「Free Bone Snapper」といプラグインを導入することで解決を見ました。

このFree Bone Snapperですが、まさにこのVRMの問題を解決するために作成されたと言ってもいい(本来はMixamoからの取り込みを想定したもののようです)プラグインです。

マーケットプレイスから「Free Bone Snapper」を検索してUEに追加しましょう。ありがたいことに無料で公開されています。作者様に感謝しながらインストールしましょう。

作者様に感謝しながらインストール



インストール完了後、プロジェクトでプラグインを有効化します(編集 > プラグイン、該当プラグインにチェックを入れたあと、UEを再起動)。

プラグインを有効化



Free Bone Snapperが導入できたら、IKリターゲティングファイルに使用している「IKリグ」ファイルを修正します。

IKリターゲティングファイルの準備に関しては以前の記事をどうぞ。

IKリグファイルですが、VRM4Uで取り込んだ際に自動的に生成されています。
取り込んだフォルダー配下に「IK_取り込んだVRM名_Mannequin」という名前で存在するはずですので、そちらを編集してIKボーンに関する設定を追加していきます。

IKリグファイルを開くと「ソルバスタック」が表示されますので、そこで新規ソルバを追加します。

Free Bone Snapperが正常に導入できていれば、新規ソルバ追加の一覧に「Bone Snapper」が表示されていますので、それを選択します。

新規ソルバ追加

ソルバスタックに「Bone Snapper」という名称のソルバが追加されます。

ソルバ「Bone Snapper」を選択(クリックしてハイライトさせる)した状態で、目的のIKボーン(ここではik_foot_l)を選択し、右クリックで「設定を選択ボーンに追加」を選択します。

設定を選択ボーンに追加

選択したボーンに「Bone Snapperボーンの設定」が追加されます。

Bone Snapperボーンの設定

追加された「Bone Snapperボーンの設定」を選択し、詳細の「Destination Bone」に追従させたいBone名を入力します

Destination Bone

IKBoneと追従させるBoneの設定

  • ik_foot_root ->設定無し
  • ik_foot_l -> J_Bip_L_Foot
  • ik_foot_r -> J_Bip_R_Foot
  • ik_hand_root ->設定無し
  • ik_hand_gun -> J_Bip_R_Hand
  • ik_hand_l -> J_Bip_L_Hand
  • ik_hand_r -> J_Bip_R_Hand

設定が済んだらIKリターゲットファイルを開いて、アニメーションを再生してIKボーンの動きを確認してみましょう。

IKボーンの動きを確認

ちゃんとIKボーンが動いてますね。

おま環かもしれませんが、設定がすぐにスケルタルメッシュに反映しなかったので、何度かIKリグを保存しなおしたり、IKリターゲットファイルを開き直したりしました。

ソルバ「Bone Snapper」のチェックボックスを外すとIKボーンのスナップが無効になってIKボーンが動きません。必ずチェックを入れたままでセーブしてください。



IKボーンの設定ついでに、以前力技で解決していたRootボーンが動いてしまう問題も解決してしまいましょう。

アニメーションをFBXファイルで書き出し、Blenderで修正して再インポート、という荒業で解決していたRootボーン問題も、簡単に解決できます。そう「Free Bone Snapper」ならね( ゚д゚)!

やり方は簡単です。

まずソルバスタックで「Bone Snapper」ソルバを選択します。

詳細タブで「Root Snap Bone Name」を指定します。Mannequin準拠なら「Pelvis」、VRoidのVRMなら「J_Bip_C_Hips」です。

Root Snap Bone Name

「In Place」にチェックを入れるのを忘れないように。

これで、Rootボーンが固定になります。

あとは、MannequinのABPから一括リターゲットを実行して、アニメーションを変換してください。

11/28 追記
「Root Snap Bone Name」に「Pelvis(J_Bip_C_Hips)」を設定し「In Place」にすると、指定したボーンが固定になるため、元のアニメーションと差異が出る場合があります。具体的には走ったりした場合に、腰(Pelvis)ボーンに移動値(上下左右の動き)がある場合です。Snapperで腰が固定になっているため、ソース側で腰の動きがある場合、背骨(Spineとそれに繋がるチェーン)がその動きに追従して「くねり」ます。
これを回避するには「Root Snap Bone Name」に「Root」を指定してください。
ただし、腰の動きがフリーになるため「In Place」にしても移動(ソースアニメーションに動きがある場合)してしまう事があるので、外部ツールやUEのシーケンサで修正が(Y方向移動量のリセット)が必要になります。



サンプルのサードパーソンプロジェクトを修正して、IK付きVRMの動作を確認してみます。

まずはBP_ThirdPersonCharacterを修正します。といっても以前と同様にABPと表示用のスケルタルメッシュを設定し直すだけです。

BP_ThirdPersonCharacterを修正



コントロールリグを修正

次に、コントロールリグを修正します。コントロールリグはABPの中で使用されています。

Mannequin用に作成されたもので、コンテンツ > Characters > Mannequins > Rigs 内にある「CR_Mannequin_BasicFootIK」がそれです。

CR_Mannequin_BasicFootIK を複製して、複製したファイルを適当にリネームします。ここでは「CR_Mannequin_BasicFootIK_Utano」にしました。

複製したファイルを適当にリネーム

複製したコントロールリグファイルを編集します。

「リグ階層」に表示されているManequin用のボーンを全選択(Ctrl+A)して削除します。

ボーンを全削除

「正常に動かなくなるかもよ?」的なメッセージが出ますが、気にせず削除しましょう(プレビュー用のMannequinがやばい表示になりますが問題ありません)。

空になった「リグ階層」上で右クリックして「インポート」を選択し、IKボーン付きのスケルトンが設定されているスケルタルメッシュを取り込みます。

インポート

「リグ階層」にVRMのIKボーン付きボーンツリーが表示されれば成功です。

IKボーン付きボーンツリー



ボーンツリー(リグ階層)が取り込めたら「Forwards Solve Graph」を修正していきます。

修正といっても特に難しいことはなく、削除されたボーン(Graph内で赤く表示されています)を対応するボーン名に設定し直すだけです。

対応するボーン名に設定し直す

「foot_l」なら「J_Bip_L_Foot」に「Pelvis」なら「J_Bip_C_Hips」に、といった具合です。

「IK_Foot_L」などは同じく「ik_foot_l」を指定します。削除したボーンを参照しているので同じ名前でも赤くなっているようなら設定し直してください

「Forwards Solve Graph」内に含まれる Local Function の「FootTrace」内も同じように設定し直してください

修正後、コンパイルしてエラーや警告が出なければOKです。

無事コンパイルできたら、こんどはABPを開いてGraph内でコントロールリグを選択して、指定されている「Control Rig Class」を先ほど修正したコントロールリグファイルに置き換えます。

修正したコントロールリグファイルに置き換え

これで修正は完了です。



実際にThirdPersonMap レベルを実行して、置き換えたVRMが期待通りの接地をするか確かめましょう。

期待通りの接地

うむ。期待通りじゃ(`・ω・´)




ここまでやるなら、最初から専用のコントロールリグを作っても同じような気がしないでもないと、やってる途中で思いましたが、まあサンプルを利用してお手軽?にやってみるというコンセプト的ななにかなので ( ̄^ ̄)

続きっぽいもの > まばたき(目パチ)アニメーションの別アプローチによる実装



Post If you feel like it, I would be happy if you could post it.