UnityのOculus Quest開発で、Oculus Integrationを使ってカメラの位置を正しく設定する方法をまとめます。
- はじめに - VRとカメラ座標
- Oculus Questにおけるカメラ座標の決定フロー
- 地面に立つ場合の設定方法
- 指定した高さから見下ろす場合の設定方法
- Stageという設定項目もある
- その他の設定項目
- 参考
Unity2019.2.10
Oculus Integration 1.41
はじめに - VRとカメラ座標
Unityエディタで開発する際、カメラの座標は当然ですがTransformから自由に指定できます。
しかしVRでは、カメラの位置 = ユーザのヘッドマウントディスプレイ(HMD)の位置となります。
ここで具体的な仕様を考えると、例えば空中を浮遊するようなカメラワークを作りたい場合にはUnityエディタで高さを指定したくなります。
これに対してその人の視線の高さに合わせてカメラを配置したい場合にはHMDの位置にカメラを置くべきです。
これらのことからVRにおけるカメラの座標はUnityのTransformで指定した座標とHMDの位置の両方が影響します。
本記事ではこのように少し複雑なOculus Questにおけるカメラ設定の方法をまとめます。
Oculus Questにおけるカメラ座標の決定フロー
さてそれではOculus Questにおけるカメラ座標の決定方法を具体的に見ていきます。
Oculus Questではカメラの座標を決める際にまずHMDの位置を取得します。
次にここにSceneに置いてあるオブジェクトを配置します。
ただしここで、この配置の仕方が二つのパターンに分かれます。
一つ目は足元を原点として配置する方法です。
もう一つはHMDの位置を原点として配置する方法です。
これだけではいまいちイメージが沸かないと思うので、次節から事例を示します。
地面に立つ場合の設定方法
いま、ユーザが地面に立っているようなアプリを作ることを考えます。
となると当然、身長190cmの人は190cmの高さに、120cmの人は120cmの高さにカメラ座標を設定したいです。
この場合は、足元を原点とする方法を使います。
足元を原点としてSceneを配置するので地面のy座標をゼロにしておけば地面にうまく立つことができます。
ただしUnity上でカメラの座標を原点からずらしている場合には、その分オフセットがかかってしまうので注意が必要です。
Oculus Integrationを使う場合、以下の手順で設定できます。
- シーン上にOVRCameraRigのPrefabを配置する
- OVRCameraRigの座標を原点(0, 0, 0)に
- OVR ManagerのTracking Origin TypeをFloor Levelに設定する
指定した高さから見下ろす場合の設定方法
次に、ユーザが空中を浮遊し3メートルの高さから見下ろすようなアプリを作ることを考えます。
そうなると、190cmの人も120cmの人も身長に関わらず3mから見下ろすようにしたいです。
この場合は、HMDを原点とする方法を使います。
こうするとHMDの位置、つまり身長に関わらず目の高さにSceneが配置されます。
実際には3mから見下ろしたいので、Unityでカメラのy座標を3に設定してオフセットを掛けます。
Oculus Integrationを使う場合、以下の手順で設定できます。
- シーン上にOVRCameraRigのPrefabを配置する
- OVRCameraRigの座標を(0, 3, 0)に
- OVR ManagerのTracking Origin TypeをEye Levelに設定する
Stageという設定項目もある
最後にOVR Managerで設定できるその他のカメラ位置関連の項目について説明します。
まず、Tracking Origin Typeにはもう一つ、Stageという選択肢があります。
これはFloor Levelと同じく地面に立つような場合に使う項目ですがユーザによるセンタリングが反映されません。
つまりユーザがOculusの設定でどの方向を「前」としていたとしても、それにかかわらず決まった方向がZ軸正方向とみなされます。
その他の設定項目
Oculus Integrationにはカメラに関連するその他の設定項目もいくつかあります。
まずUse Position Trackingにチェックを付けると歩き回った時にカメラが移動します。
ほとんどのアプリではONでOKです。
さらにその下のUse IPD In Position Trackingは目の間の距離をカメラに反映するかどうかの設定項目です。
正直よくわかりませんが、ONにしないと不自然になるため基本ONで問題なさそうです。
ちなみにIPDは瞳孔間距離という意味らしいです。
参考
情報古かったりしてイマイチあてになりませんが公式ドキュメントを貼っておきます。
developer.oculus.com