develog.me

into VR

2台のOculusRiftを1台のPCに接続してみた

OculusRift%25E3%2582%25922%25E5%258F%25B0%25E6%258E%25A5%25E7%25B6%259A%25E3%2581%2597%25E3%2581%25A6%25E3%2581%25BF%25E3%2581%259F%25E3%2580%2582connecting_multiple_OculusRift_-_YouTube.png

対象

ovr_unity_0.2.5_lib

標準機能

OculusRiftを2台接続すると、もう1台は体の向きとして動くようになっていた。

OVRPlayerControllerを使っていれば何もせずとも動く。
これでDK2が来ても安心!

Let’s Hacking!

もう1台のOculusRiftもプレイヤーとして使ってみる

マルチプレイはとーってもおもしろい。表現の可能性が一気に広がる。
Photon使って実現することもできるが、Ocufesの会場にインターネット回線がないかもしれない。
ということで、ローカルで2Pプレイをやってみる。

課題としては次の2点

  1. ディスプレイにどうやって映すか?
  2. ヘッドトラッキングのセンサーの値をどうやって分離するか?

1. ディスプレイにどうやって映すか?

OculusRiftは映像をサイド・バイ・サイドに映して3Dを実現。
また、110°の視野角を確保するために樽型ひずみ( Barrel distortion )で映像を収束してモニターに映し、レンズを通して糸巻型ひずみ( Pincushion distortion )で絵を広げることをやってのけたアイディア大賞の製品。

ここでポイントとなるのは絵をサイド・バイ・サイドで映しているところ。

対応方式としては、グローバルゲームジャムでやった @koukiwfさん発案のアプローチ

  1. Unity側で Game ビューに映し出すカメラの領域を変更する。
  2. ビルド後にゲームをWindowモードで起動し、拡張ディスプレイで縦に並べた2つのOculusのモニターをまたぐよう、ウインドウをリサイズしてあげる。 GGJ%25E3%2581%258A%25E5%258F%25B0%25E5%25A0%25B4%25E4%25BC%259A%25E5%25A0%25B4.png

Unityでの具体的な設定方法

  1. OVRPlayerControllerを2つ Scene ビューに配置
  2. Hierarchy ビューでOVRCameraをアタッチしたGameObjectを選択し、 Inspector ビューで OVRPlayerControllerにそれぞれ2つあるOVRCamera、計4つの Viewport Rect を次のように修正。上に映すものは 0.5 下は -0.5 https://lh3.googleusercontent.com/-4WvnZssQD1o/Uv-sJtRk8DI/AAAAAAAAA-o/Q0Bf8gdEOPM/w753-h700-no/sidebysideplus.png

2. ヘッドトラッキングのセンサーの値をどうやって分離するか?

  1. 次のような感じでソース改変
    • OVRCameraController
      • 追加
        public int PlayerNo = 0;
        
    • OVRCameraControllerEditor.OnInspectorGUI
      • 追加
        m_Component.PlayerNo = EditorGUILayout.IntField("Player NO", m_Component.PlayerNo);
        
    • OVRCamera.SetCameraOrientation
      • 変更前
        // Read sensor here (prediction on or off)
        if (CameraController.PredictionOn == false)
            OVRDevice.GetOrientation(0, ref CameraOrientation);
        else
            OVRDevice.GetPredictedOrientation(0, ref CameraOrientation);
        
      • 変更後
        // Read sensor here (prediction on or off)
        if (CameraController.PredictionOn == false)
            OVRDevice .GetOrientation(CameraController.PlayerNo, ref CameraOrientation);
        else
            OVRDevice .GetPredictedOrientation(CameraController.PlayerNo, ref CameraOrientation);
        
    • OVRDevice.InitOrientationSensorList
      • 変更前
        // InitOrientationSensorList
        public static void InitOrientationSensorList()
        {
            SensorOrientationList.Clear();
            SensorOrientationList.Add (0, SensorOrientation.Head);
            SensorOrientationList.Add (1, SensorOrientation.Other);
        }
        
      • 変更後
        // InitOrientationSensorList
        public static void InitOrientationSensorList()
        {
            SensorOrientationList.Clear();
            SensorOrientationList.Add (0, SensorOrientation .Head);
            SensorOrientationList.Add (1, SensorOrientation .Head);
        }    
        
  2. 4つあるカメラのDepthを1から0へ(先ほどの画像にあるNOTE)
  3. 各OVRCameraControllerの PlayerNO を設定する。 1Pは 0 を、2Pは 1 を設定
  4. 実行
  5. 注意
    USBの認識が不安定でOculusRiftが2台ともちゃんと認識しない場合がある。
    確認方法としては、OculusRiftを2台接続して OVRPlayerController.UpdateDebug.Log (OVRDevice.SensorCount); を追加して実行。
    コンソールに 2 と表示されることを確認する。 1 であれば1台しか認識していないのでUSBを挿しなおすか、別のポートへ差し替えて実行し直す。
    どうしてもダメならUSB3.0のハブ(ACアダプタつき)を買う。
    • 今回試したのはMacbook Proの左のポートへUSB3.0のハブをバスパワー駆動で接続。2台のOculusを両方共USB給電で接続して試した。(実は結構不安定で3回位接続しなおして動く