UE4でVR内の視線入力実装

 

こんにちは、なっつーです。

(この記事はUE4.15.1時点での内容です。)

 

 

VR内で視線入力を使うことはないでしょうか?

見てる方向のオブジェクトをターゲットしたいときなどあるかと思います。

 

UE4で視線入力と言えば、LineTraceを使いそうですが、

遠くの物や小さい物をターゲットするのが難しいので、

より快適に操作するために、SphereTracew使用します。

 

VRカメラの視野角は、OculusRiftCV1の場合、

左右が約40°、上下が約45°あります。

※視線中央から5°毎にキューブを配置した様子

 

SphereTraceを使うことで、カメラの視野角に対して、

下図のような範囲でのトレースを行うことができます。

 

今回は、VirtualRealityのテンプレートを使用します。

 

BP_PickupCube(画像の青いキューブ)をターゲットにする対象とします。

 

まず、視線入力を受けたときの関数をブループリントインターフェースで作成します。

テンプレートに既存のPickupActorInterfaceを編集し、

LockOn関数を作成します。

 

次に、BP_PickupCubeのイベントグラフに下記のように、

Targetされているときだけマテリアルを変更するノードを組みます。

 

最後にMotionControllerPawnにてトレース部分のノードを組みます。

SphereTraceだと、一番近い位置のオブジェクトがターゲットされてしまうため、

MultiSphereTraceを使用します。

複数トレースヒットした場合は、一番中心にあるものがターゲットされるように、

カメラの向きと方向ベクトルの差を計算し、一番小さいものを選んでます。

 

これでVRプレビューすると、トレースヒットしているポイントが赤四角で、

ターゲットされているオブジェクトは灰色に変化してます。

このようにカメラ中心(画面上だと右上に寄っているが、VR内だと真ん中に表示されている)に

一番近いオブジェクトを選択することができます。

 

 

おまけ

上記の方法だと距離が遠くなったときに、視野角に対してトレースできる範囲が狭くなります。

コーン状にトレースできるノードがあればいいのですが、そういうものはないようで、

下記のように、いくつかのトレース範囲に分けて、

第1トレースでヒットしなければ、第2トレース開始、

第2トレースでヒットしなければ、第3トレース開始・・というようにすればいいかもしれません。

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。