Unity で VR モード時にカメラの位置を固定する

Unity で VR モードにして Oculus Rift, HTC Vive などのヘッドマウントディスプレイでプレイすると、自動的に hmd とセンサーとの距離からカメラの位置が動く。

これは、 Unity 公式ドキュメント:VR 概要 の “カメラを理解する” のセクションに記載されている。

カメラの Transform は、ヘッドトラッキングされた姿勢で上書きされます。

カメラの位置 (position) は固定して回転 (rotation) のみ有効にしたい場合がある。そのためには、カメラの親となるゲームオブジェクトにカメラの動きを無効化するための処理を加える必要がある。

もしもカメラを動かしたい場合は、別のゲームオブジェクトの子としてアタッチし、そのゲームオブジェクトのルートを動かしてください。

Unity の VR モードでカメラの位置を固定してみる

Unity VR モードのカメラを固定

今回は CameraController という空のゲームオブジェクトを配置し、その中に Main Camera を挿入した。CameraController にスクリプト CameraController.cs を Add Component した状態。

スクリプトの中身は以下のようにする。

CameraController.cs

using UnityEngine;
using UnityEngine.VR;
using System.Collections;

public class CameraController : MonoBehaviour {

void Update () {
    // TODO: ここで固定したい位置があれば指定しておく
    Vector3 basePos = Vector3.zero;

    // VR.InputTracking から hmd の位置を取得
    Vector3 trackingPos =
            InputTracking.GetLocalPosition(VRNode.CenterEye);

    // CameraController 自体の rotation が
    // zero でなければ rotation を掛ける
    // trackingPosition = trackingPos * transform.rotation;

    // 固定したい位置から hmd の位置を
    // 差し引いて実質 hmd の移動を無効化する
    transform.position = basePos - trackingPos;
}

}

CameraController の position に、固定したい位置から VR.InputTracking のポジションを引いた値を代入している。 Update メソッドに処理を書くことで常に hmd の動きを無効化するようにしているが、初期位置のみ固定したい場合は Start メソッド内に処理を移動すればオッケー。

また、ローテーションを無効化したい場合も同じように固定したい rotaiton との減算を行えば大丈夫。

補足

位置固定はできるが、実際にこれで Oculus, Vive などでプレイすると実際の動きとの差で VR 酔いを起こしてしまうかもしれない。自分の場合は少し気持ち悪さを感じたので、本番のプロジェクトでは導入しない予定。

特定のケースに限定して、同しようもない場合にこのような実装にしたほうが良いと思う。また、 Unity で位置やローテーションの無効化をサポートしそうな気もするので最新情報をキャッチしてから組み込んだほうが良いかも。既にあったりしたら教えてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です