XR Interaction Toolkit を用いたテレポート/ワープ処理の実装方法【XR Interaction Toolkit】

XR Interaction Toolkit を用いて VR 空間内でテレポート/ワープ処理を実装します.

Oculus Integration でのテレポート/ワープ実装方法

以前に Oculus Integration を用いた場合のテレポート/ワープ実装方法をまとめています.
xrdnk.hateblo.jp

今回は XR Interaction Toolkit のみで実装します.

XR Interaction Toolkit での Teleportation

Teleportation 実装に必要なコンポーネントがあります.
Teleportation Provider,Teleportation Anchor,Teleportation Area です.

Teleportation Provider

テレポート用のプロバイダコンポーネントです.
System には XR Rig の Locomotion System を設定します.

f:id:xrdnk:20210131233152p:plain

Teleportation Anchor, Teleportation Area

Teleportation Anchor はテレポート先のアンカーになります.「点」として捉える感じです.
Teleportation Area はテレポート処理が可能なエリアになります.「平面」として捉える感じです.
パラメタ内容は両者とも殆ど同じですが,後者は Teleportation Anchor Transform がありません.

Interaction Manager

Interaction Manager を設定します.特に設定しない場合は実行時に Hierarchy 上で自動で走査します.

Interaction Layer Mask

Layer Mask を設定します.テレポ限定の Layer を設定すると良いかもしません.

Colliders

テレポ判定用のコライダを設定します.

Custom Reticle

テレポート実行可能時に表示する Reticle を設定します.Reticle はこれのことですね.

f:id:xrdnk:20210202055522p:plain

Teleport Anchor Transform

Anchor 限定のパラメタ.テレポート先の座標位置を設定することができます.
設定しない場合は,Teleportation Anchor がアタッチされているオブジェクトの Transform が割り当てられます.
細かく位置調整したい場合は設定すると良いでしょう.

Teleportation Configuration

Match Orientation

テレポート処理後にリグ内のどのオブジェクトの向きを目的地と一致させるかを指定します.

Match Orientation ですが,0.9 と 0.10 以降で Enum の内容が変わっているので注意.
0.9 以前は Camera, None のみだったのに対し,
0.10 は WorldSpaceUp,TargetUp,TargetUpAndForward,None に変更されています.
なので,0.9 と 0.10 以後でテレポート処理後の挙動が変わっています.

こちら4つの使い分けについては実機確認と合わせて後で確認しますが一応説明します.

World Space Up

テレポート後,XR Rig の y軸の正の向きをワールド空間の y軸の正の向きに一致するようにします.
z軸の向きはテレポート前と同じです.

Target Up

テレポート後,XR Rig の y軸の正の向きをテレポート先に指定したオブジェクトの y軸の正の向きに一致するようにします.
z軸の向きはテレポート後と同じです.

Target Up And Forward

テレポート後,XR Rig の y軸z軸を テレポート先に指定したオブジェクトの y軸z軸の正の向きに一致するようにします.

None

テレポート後,軸の向き合わせ処理は特に行いません.テレポート前の軸の向きのままになります.

Teleport Trigger

どのタイミングでテレポート処理を実行するか設定します.
OnSelectExited,OnSelectEntered,OnActivated,OnDeactivatedの4つから選べます.

Teleportation Provider

Teleportation Provider を設定します.
特に設定していない場合は実行時に自動で走査されます.

実機確認

Reticle オブジェクトは今回設定していませんが,
テレポート可能な場合は Ray の色が変わるのでそれで判別を行います.

Match Orientation の検証のため,少し奇妙ですが,
Cube の y軸,z軸を図のようにします.

f:id:xrdnk:20210202070756j:plain

以下,XR Rig の y軸(緑),z軸(青)に注目してください.

WorldSpaceUp で確認

gyazo.com

テレポート処理後の XR Rig の y軸の向きは ワールドの y軸の正の向きに合っています.

Target Up で確認

gyazo.com

テレポート処理後の XR Rig の y軸の向きは Cube の y軸の正の向きに合っています.

Target Up and Forward で確認

gyazo.com

テレポート処理後の XR Rig の y軸,z軸の向きは Cube の y軸,z軸の正の向きに合っています.

None で確認

None は World Space Up と同じようになりました.
特に位置合わせを行わない場合,XR Rig の軸の向きはテレポート前と同じようになります

なので検証するならば,上の青い Cube で Target Up And Forward にして,Plane を None にしてみましょう.
Cube で XR Rig のy軸の向きがおかしくなったまま,Plane にテレポしてみます.

gyazo.com

検証通りNoneの場合,XR Rig の軸の向きはテレポート前と同じようになりました.

終わりに

Match Orientation の検証をしていたら,XR Rig の向きがありえんことになって久しぶりにVR酔いしました….
Match Orientation は特別な理由がなければ,World Space Up でいいんじゃないかなあと思います.
何か特別なギミックのために Target Up などにするのはありかもしれませんが,VR酔いを起こさないように工夫しましょう.