Unreal Engine 5を使ってみる その20(ハンドトラッキングのコリジョンと物体の把持、Meta XR Interaction SDK Unreal)
はじめに
今回はUnreal Engine 5でのハンドトラッキングにおけるコリジョンの設定と物体の把持について試してみました。
Meta XRのプラグインの追加などは前回の記事で行っています。
▼こちらの記事ではコントローラで操作していました。
公式のサンプルプロジェクトが色々用意されているので試したいところですが、ビルドできなかったので、ネット上の情報を探しながら試しています。Unreal EngineよりもUnityの方が情報が多いという印象です。
▼容量に余裕ができたら試したいなと思っています。GitHubではなくFabに公開してほしいところですね。
https://developers.meta.com/horizon/code-samples/unreal?locale=ja_JP
https://github.com/oculus-samples/Unreal-Phanto
https://github.com/oculus-samples/Unreal-InteractionSDK-Sample
▼VRゴーグルはMeta Quest 3Sを利用しています。
▼PCは10万円ぐらいで購入したゲーミングノートPCを利用しています。Windows 11の環境です。
コリジョンの設定
デフォルトのVRGameModeで設定されているVRPawnはコントローラでの設定がデフォルトになっています。
VRPawnを編集して、ハンドトラッキングで操作できるようにしていきます。
▼以下の動画が参考になりました。
ハンドトラッキング用の右手と左手のオブジェクトを追加します。
▼OculusXRHandをMotionControllerRightGripとMotionControllerLeftGripに追加しました。

▼OculusXRHandの設定で、Rightを設定することで右手用のオブジェクトになります。左手も同様です。


この状態で動作を確認してみました。
▼手の動きに合わせて動いています。元々あったコントローラ用の手は変な位置にあります。
▼コントローラ用の手のオブジェクトは、スケルタルメッシュをクリアすると表示されなくなりました。

手の動きは追従できたのですが、コリジョンが設定されていないので物体をすり抜けます。コリジョンを設定してみます。
▼先程と同じ方の動画が参考になりました。
Initialize Hand Physicsを有効にすると、コリジョンが設定されるようでした。
▼Begin PlayにInitialize Hand Physicsを接続し、右手ならHand Rightのスケルトンが設定されるようにしました。

ブループリントで設定しなくても、OculusXRHandの詳細で設定すればコリジョンが設定されていました。
▼Initialize Physicsがあります。

実際にコリジョンが設定されているか確認してみました。
▼物体と衝突しています!掴むことはできないようです。
次に物体を掴むことができるように設定していきます。
Meta XR Interaction SDK Unrealをインストールする
物体を掴むときはMeta XRとは別に、Meta XR Interaction SDKというプラグインが必要なようです。
▼Meta XR Interaction SDKに関するページはこちら
https://developers.meta.com/horizon/documentation/unreal/unreal-isdk-getting-started
Meta XRを追加したときと同様に、Unreal Engineのエンジン部分の、Pluginsフォルダにプラグインのフォルダを追加しました。
▼こちらからダウンロードできます。
https://developers.meta.com/horizon/documentation/unreal/unreal-isdk-overview
▼プラグインを追加しました。

▼プラグインを有効化して、プロジェクトを再起動しました。

ハンドトラッキングで物体を掴む
プラグインが追加されたので、物体を掴めるように設定していきます。
▼以下のページを参考に進めます。
https://developers.meta.com/horizon/documentation/unreal/unreal-isdk-getting-started
▼以下の動画で、同じような内容が紹介されていました。
チュートリアルに従って、ゲームモードとポーンを新しく作成します。
▼MyGameという名前で新しくゲームモードを作成しました。


▼MyPawnという名前で新しくポーンを作成しました。

▼MyGameModeのデフォルトのポーンクラスをMyPawnに設定しておきました。

▼MyPawnに必要なコンポーネントを追加しました。


ブループリントでノードを設定していきます。
▼トラッキングスペースの設定を行いました。

入力を受け付けるように設定していきます。
▼Add Mapping Context関連のノードを追加しました。

▼歯車マークで「エンジンのコンテンツを表示」と「プラグインコンテンツを表示」を有効にしないと、Isdk関連の入力マッピングコンテキストが表示されませんでした。

▼コンポーネントのモーションコントローラーはRightに設定しています。

▼この状態で起動すると、手が表示されました。

ただしこの状態では物体を掴むことができませんでした。Metaのドキュメント通りには作成しているはずで、Youtubeのコメント欄でも物体を掴めないという方が大勢いました。
調べていると、コミュニティフォーラムで解決策を見つけました。
▼以下のフォーラムです。
掴む対象の物体にコンポーネントを追加する必要があります。
IsdkGrabTransformerとIsdkGrabbableAudioを追加する必要があると書かれていました。実際に試したところ、IsdkGrabTransformerだけ追加すると掴めるようになりました。
▼IsdkGrabTransformerを追加しました。

また、Isdk関連のハンドでコリジョンを設定する方法が分からなかったので、先程のOculus XRHand Componentを重ねることにしました。
▼左手だけ追加して、コリジョンが反映されるようにしました。

▼マテリアルが重なったように見えてしまいます。

▼Oculus XRHand ComponentのマテリアルをM_Glassにして、透明にすると違和感が無くていい感じでした。

これで動作を確認してみました。
▼物体を掴むことができました!左手だけコリジョンも設定されています。
▼両手で掴むと、大きさを変更できることに気づきました。IsdkGrabTransformerを追加したからだと思います。
他にも生成AIで生成した家具を掴んでみました。
▼VRで空間に入って初めて、家具の大きさが思っていたよりも大きいことに気づきました。
最後に
ハンドトラッキングで物体を掴むのに結構苦戦してしまいました。本当は指がめり込んだりせずに、物体に沿うような指の配置にしたいので、もう少しこだわりたいところです。
ハンドトラッキングでの移動は、今はピンチ動作に対応させています。もっといい移動方法があれば試してみて、また別の記事にまとめようと思っています。手の動きによる簡単なコマンド操作の方法が必要になりそうです。