FOVE · Rift · VRソフト

HMDトラッキングとカメラの向き変更

#ChannelPlayerには、HMDデバイス向けには、Fove/RIFT両方で動くバージョンとOculus Store専用バージョンがある。VR動画再生時に使うカメラは、それぞれ異なり、前者は普通のカメラにFove Interface 2をアタッチしたものをFoveの時はそのままで、Riftの時にはFove Interface 2を無効にして実装している。またOculus Store専用バージョンでは普通のカメラではなく、申請時のチェックが通るようOVRCameraRigを使うのでカメラ制御のやり方が少し変わってしまい、試行錯誤している。同じプロジェクトでifdef使ってというやり方もあるのだが、GameObjectが異なるのは面倒なので現在は別のプロジェクトになっている。

Fove/RIFT両方で動くバージョンは、昨日Ver1.06にしたが、Store専用バージョンは未だVer1.04なので、Ver1.06になるようカメラの向きなどの制御のコードを持ってきた。

先に書いたようにカメラが異なるので同じコードでは、思ったように動かない。

まず、Foveは以前にも書いたが、カメラ固定には

XRDevice.DisableAutoXRCameraTracking(_camera, true); 

は利かない。その代わりFoveInterfaceBase.csに手を入れて、camera_control_by_systemを無効にするとカメラ固定できるようにした。

        protected void EnsureLocalDataConcurrency()
        {
            if (!enabled)
                return;

            CheckStaticConcurrency();

            if (_localDataIsCurrent)
                return;

            if (_isAuthoritative && camera_control_by_system)
            {
                // position head
                if (position)

またついでに以下のようなコードも追加した。理由はRiftで動作させるときに、FoveInterface2を無効にしても内部ではライブラリ側が動いていて、FOVEがシステムに無いことを示すエラーログが出力されるのでそれを抑止するためのものである。

        private void Start()
        {
            if (XRDevice.model != "Oculus Rift CV1")
            {
                StartHelper();
            }
        }

なおカメラ固定にはRiftでは普通のカメラならUnityが用意した「XRDevice.DisableAutoXRCameraTracking」が使えるが、OVRCameraRigでは効かないので、その代わり以下を使う。

OVRManager.instance.usePositionTracking = false;
OVRManager.instance.useRotationTracking = false;

また、それとは別に、カメラの向きをXboxコントローラーのスティックで任意の方向に変更しつつ、HMDトラッキングオンを実現するには、カメラを付けたGameObjectの親のPositionやRotationを変更すれば良い。

        // カメラの位置と角度を変更
        if (!_fixed)
        {
            // 非固定の場合
            trackingPos = trackingPos + newPos;
            //trackingRot = trackingRot * newRot;
            trackingRot = Quaternion.Slerp(trackingRot, newRot, 0.5f);
        }
        else
        {   // 固定の場合
            trackingPos = basePos + newPos;
            //trackingRot = baseRot * newRot;
            trackingRot = Quaternion.Slerp(baseRot, newRot, 0.5f);
        }
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中