DEV Community

KOGA Mitsuhiro
KOGA Mitsuhiro

Posted on • Originally published at qiita.com

Oculus QuestだけでフリーロームVR向けに複数人を位置トラッキングする

はじめに

本記事はUnity #2 Advent Calendar 2019 の14日目の記事です。
フリーロームVRをマルチプレイヤーで実現するためにはプレイヤーのトラッキングが必要となり割と大掛りな機器が必要となります。
それをOculus Questのガーディアンだけでそこそこの精度で実現できたので紹介したいと思います。

フリーロームVRとは

フリーロームVRとはプレイヤーがフィールド内を自由に歩き回る事が可能なVRコンテンツで以下のような施設があります(ありました)

Oculus Questの設定

ホーム画面でルームスケールに設定して歩ける範囲をガーディアンの境界線を引きます。以下の図は境界線とそれを元に生成されたプレイエリア(四角形の領域)です。
image.png

この時にマルチプレイで使用するOculus Questでほぼ同じプレイエリアを作るのが位置合わせで重要になってきます。
床の四隅にガムテームなどでのような形で目印を作りそのラインに沿って境界線を引くとほぼ同じプレイエリアができあがります。

Unityの設定

  1. Oculus Integrationをインポートします。
  2. OVRCameraRigプレハブやOVRPlayerControllerプレハブをヒエラルキーに追加します。
  3. このプレハブにアタッチされているOVRManagerを探し、Tracking > Tracking Origin TypeStageに変更します。

image.png

Tracking Origin TypeEye LevelFloor LevelではプレイヤーのXZ座標はヒエラルキーに配置した位置のままですが、Stageにするとゲームの原点座標(0,0,0)はプレイエリアの中心になり、プレイヤーのGameObjectはプレイエリアの中心を基準にした位置に移動します。この仕組みによって実際に歩く領域とゲーム内の位置を合わせる事ができます。

プレイエリアの問題

ルームスケールのプレイエリアで複数台のOculus Questの位置トラッキングができそうですが1つだけ問題があります。
ゲームの原点とプレイエリアの中心を合わせる事はできるのですがY軸が回転してZ軸の向きが原点から4辺のいずれかになり確定することができません。
つまり、同じ領域のプレイエリアを作っても0°、90°、180°、270°のいずれかに回転してしまうので、プレイヤーのTransformを同期しても位置が合わない事があります。

この問題をオペレーションなしに解決して正面方向を合わせる方法として以下の手順を考えました。

  1. プレイエリアを4等分する。(十字型でも×でもよい)
  2. プレイヤーの初期位置を4等分した領域のいずれかに配置して正面方向も固定する。たとえば(3, -3, 0)を初期位置、このPositionに対してforwardを正面方向とするならback、right、leftを向かないこと。
  3. ゲームを開始して数フレーム以降にプレイヤーが正面を向いていなければプレイエリアが回転しているので原点を中心にプレイヤーのGameObjectを回転する。プレイヤーが右を向いているとプレイエリアは90°回転なのでプレイヤーのGameObjectを-90°回転する。

ゲーム開始直後だとプレイヤーの位置が反映されていないのでAwakeStartを使えません。ネットワークライブラリで同期する直前あたりでフェードインして回転補正すると無難だと思います。もっと良い方法があればコメントで教えていただけると助かります。

回転補正前のプレイエリアとプレイヤーの位置と向きのパターン

image.png

まとめ

Oculus Questのガーディアンすごい!

Top comments (0)