2020/12/22

OculusQuest2(その2) ワープ移動

WRITER: k.okawa

関連記事一覧

OculusQuest2(その1) VRで物を掴む投げる離す

OculusQuest2(その2) ワープ移動←今回の記事

OculusQuest2(その3) UI

 

はじめに

前回に引き続き、今回はVRのワープ移動について書いていきます。

ワープ移動はほとんどの移動が必要なVRゲームに実装されている方法です。

ワープ移動のほかに、FPSゲームのように入力された方向にスムーズに移動する方法があります。

しかし、この移動方法はVRの視点に慣れていないと酔ってしまうため、移動はワープ移動で実装するのが無難かとおもいます。

 

最後にソースコード全体と、使い方も紹介します。

 

今回作成したサンプル

 

2つの操作

2種類の入力を判定して、ワープ移動と回転を実装しました。

 

1.回転

回転は今回のメインの内容ではありませんが、特に難しい実装はありません。

はじめにも書きました通り、スムーズに視界が動くと酔うのでスティックを倒した時45度間隔で回転させています。

 

コードは以下の二つです

入力判定Unirx使用

初期化時に上記を登録します。

UpdateAsObservableは毎フレームの処理を登録するためのものです。

Selectでは、コントローラーの右スティックのX軸の値(-1f~1f)を選択。

Bufferでは、2フレーム分の入力をまとめて、後の処理に流します。

Whereでは、list[0]には前フレームの入力、list[1]には現在のフレームの入力が入ります。

そして、0.1fの境界をまたいだ瞬間のみ次に処理を回します。(それ以外はブロックされます)

2つ目のSelectで、現在の入力値を選択。

Subscribeで回転処理を実行します。

AddToはthisが破棄されたときに購読を破棄するという指定をしています。

 

このようにUnirxを使用すると、コンパクトに入力判定ができます。

 

回転の実装

移動中は回転させないようにし、スティックの倒された方向によって回転させます。

 

2.ワープ移動

今回の本題です。

入力の判定は、回転よりはシンプルです。

 

左スティックのY入力値をそのままWarpMoveに渡します。

 

スティックが前方向に倒されたときに、サークル位置と放物線の計算を行い、

スティックが離されたときに、サークルの位置まで自分自身を瞬間移動させています。

 

順に処理を解説していきます。

 

ワープ位置の計算

 

距離の計算

始めに自分からどのくらい離れた位置にサークルを置くか計算します。

(距離のみで、方向はまだ計算しません)

距離は左コントローラーの正面方向のY軸の値で決定しています。

真上を向いているときは1

水平方向の時は0

真下を向いているときは-1

の値になります。

 

操作性の都合で、

真上を向いているときは0.75f

水平方向の時は-0.1f~0.1f

真下を向いているときは-0.75f

に変換しています。

 

Y軸の値が0に近づくほどサークルを遠くに

1fまたは-1fに近づくほどサークルを近くになるようにしています。

 

方向の計算

前回の方法で距離を求めたあと、コントローラーの向きでサークルの位置を決定します。

 

ベジェ曲線

ワープ線の表示はベジェ曲線の計算を利用しています。

2次ベジェ曲線と3次ベジェ曲線がありますが、

今回は2つの点の間を一つのコントロールポイントで制御する2次ベジェ曲線を用います。

 

UnityのVector3クラスにはLerp関数が用意されているので計算自体はシンプルです。

fromには自分の立ち位置をtoにはサークルの位置を渡して計算します。

pはコントロールポイントで、曲がり具合を決定する要因になります。

tには0f~1fの値を等間隔で分割して渡していくことで、放物線のポイントを取得していきます。

 

文章では分かりづらいので、ポイントを求める手順を動画にしました。


求められたmpをつないでいくことによって結果的に、放物線が出来上がります。

 

コントロールポイント(p)によって放物線の曲がり具合が決まるため、

今回作成したVRサンプルでは、コントローラーの上下の傾きによってpの位置を変更しています。

 

詳しくは、最後の全体ソースコードをご参照ください。

 

ソースコード

今回作成したソースコードです。

コード内で以下のライブラリを使用しています。

UniRx

https://assetstore.unity.com/packages/tools/integration/unirx-reactive-extensions-for-unity-17276

 

 

Playerの構成に関しましては前回の記事をご参照ください。

 

名前 説明
MaxDegree コントローラのY軸の、最大距離と判定する範囲(以上)
MinDegree コントローラのY軸の、最小距離と判定する範囲
MaxDistance 移動する最大の距離
MinDistance 移動する最低の距離
RotDegree 何度ずつ回転するか

 

こちらサークルの画像です、ご自由にお使いください。

k.okawa

k.okawa

Unityエンジニア
19年新卒