EXTRA PHASE: WebXR空間での自由移動
本章のゴール
WebXR空間内の移動方法を学ぶ。
デフォルトのWebXRエクスペリエンスでは、指定した床面への「テレポート移動」が標準となっており、これが最も酔いが少ないとされています。
ゲームコントローラーのようにコントローラーを用いてシームレスに移動させる方法もあります。
VR体験における一般的な移動法として以下のような方法が存在します。
- Teleport(瞬間移動): 指定したポイントへ一瞬で移動する方式。VR酔いが最も起きにくい標準的な移動法
- Strafe(ストレイフ): FPSゲームのように視線の高さを維持したまま、水平な地面を這うように前後左右へ移動する方式
- Flying(飛行移動): 立体的に飛ぶように移動する方式
- Room-scale(ルームスケール移動): 現実空間でプレイヤー自身が実際に歩いて移動する方式
本章ではこれらの移動アルゴリズムについて解説します。
1. 瞬間移動テレポート
Babylon.jsのテレポート機能は、空間内に「光線」を飛ばし、ユーザーがボタンを離した瞬間にカメラの親となる基準点のX・Y・Z座標を、その着地座標へと直接上書きします。
操作の際に親指のスティックを倒した方向に合わせてアローが反応し、ワープと同時に「向いている方向」を書き換えることもできます。
経路上の移動を描画せず一瞬で座標・高さ・角度を書き換えることで、視覚と三半規管のズレによるVR酔いを回避するロジックになっています。
2. ストレイフ移動
コントローラーのスティックからの入力を読み取り、座標へと転換するアルゴリズムです。
入力された前後左右への指示を、カメラが向いている方向を基準にして計算します。この際、高さを無視した水平方向のみを計算の対象とすることで、高さを一定に保った滑らかな水平歩行が作り出されます。計算された移動量は、現在のカメラの座標へと継続的に足し合わされます。
3. 飛行移動
ストレイフ移動が高さを無視した水平面での計算であるのに対し、飛行移動ではカメラの向き(上下の傾きを含む)をそのまま移動方向として使用します。
プレイヤーが見ている方向に対してスティックの入力を加算するため、上を向いてスティックを倒せば上昇し、下を向けば下降する、空を飛ぶような立体的な挙動が実現されます。
4. ルームスケール移動
これは現実の身体の動きと完全に一致した移動です。WebXR空間内のオブジェクトが現実空間の動きと完全に一致するように表示されます。
WebXRセッションが開始されると、HMDの位置トラッキングが自動的にカメラ座標へ反映されるため、特別な実装は不要です。プレイヤーが現実空間で歩いた分だけ、そのままVR空間内でも移動します。
ここまで4つの移動法を紹介しましたが、いずれも本質的には「カメラの座標と向きをどのように書き換えるか」の違いです。この考え方を持っておくと、移動法の選択や独自カスタマイズの見通しが立てやすくなります。
WebXRにおけるカメラモーションについて
babylon-mmdには、VMDに含まれるカメラモーションを再生するための専用カメラ(MmdCamera)が用意されています。PC画面での鑑賞用途であれば、モデルのモーションとカメラワークを完全に同期させた演出が可能です。
しかし、PC向けのVMDカメラモーションはWebXR空間にそのまま適用すべきではありません。激しいズームや回転はVR酔いの直接的な原因となり、処理落ち時にどのような悪影響が出るか計り知れません。カメラ演出を取り入れたい場合は、WebXR空間での体験を前提としたWebXR向けのカメラモーションを別途設計することをお勧めします。
お疲れ様でした。酔いにくく、ユーザーにとって慣れ親しんだ移動法を選択しましょう。