はじめに
UE4でVRのアプリを作成するときにVRテンプレートを使っているのですが、つかんだ物が他の物にめり込んでしまうため、テーブルの上にコップを置くときに吹き飛んでしまうような症状が発生します(これはテーブル側も動かせる物だった場合)。
テーブルの上にコップを置いただけなのに吹き飛んでしまう pic.twitter.com/IZIcyQ6Ukh
— 高浜 (@SatoshiTakahama) October 25, 2020
これは、手を放したときに、つかんでいた物のコライダーとめり込んだ物のコライダーが反応するために発生していますが、VRテンプレートではつかんだ物はコントローラにアタッチされる(子になる)ことと、VRではコントローラは実際の手の動きに追従させるため(そうしないと違和感が発生する)手が他の物にめり込むことが許容されることから、このような状況になります。
つかんだ物をコントローラにアタッチするかわりに、つかんだ物をPhysicsHandleでコントローラに追従する方法に変更することで、めり込まないようにすることができました。
PhysicsHandleを使うことで、期待したような動作になった pic.twitter.com/Kxpv8PpWWs
— 高浜 (@SatoshiTakahama) October 26, 2020
環境
Windows10
UnrealEngine 4.25.4
作り方
・プロジェクトはVRテンプレートを使用します。
・VirtualRealityBPフォルダ=>BlueprintsフォルダにあるBP_PickupCubeの編集画面を起動します。
・PhysicsHandle型のPhysicsHandleと、SceneComponent型のAttatch、Boolean型のGrabの3個の変数を追加します。
・Pickupイベントの処理を以下のように差し替えます。PhysicsHandleを生成して、コントローラとつかんだ物をくっつけています。
・Dropイベントの処理を以下のように差し替えます。
・Tickイベントの処理を以下のように作成します。コントローラの位置をPhysicsHandleに設定して、つかんだ物が追従できるようにしています。
・次に、VirtualRealityBPフォルダ=>BlueprintsフォルダにあるBP_MotionControllerの編集画面を起動します。
・ReleaseActorの処理を以下のように、?IsValidノードとDropノードを直接つなぐように修正します。これは、コントローラの左右を判定するために入っていたと思われる処理ですが、今回Attatchしないので正しく機能しません。左右の判定自体は、AttatchActorが有効かどうかの判定だけでできているため、この処理をとばしても問題なく動作しました。
・Tickイベントの上から3番目の処理を以下のように、SetCollisionEnabledノードの手前に?IsValidノードを追加します。ここは手を握ったときにコライダーを有効にしている処理ですが、物をつかんでいるときはコライダーではじかれないように修正します。
参考資料
・ue4-masterのブログ
PhysicsHandleを使って物をつかむ方法を参考(というかほぼそのままですが)にさせていただきました。
・[UE4] Physics系コンポーネントのパラメータ調整リファレンス
PhysicsHandleのパラメータ調整するときに参考になります。