対象
ovr_unity_0.2.5_lib
標準機能
OculusRiftを2台接続すると、もう1台は体の向きとして動くようになっていた。
.@yuujii ほうほうほう。二台目が欲しくなる。#DK2が出たときのDK1の活用方法が初めから用意されているというのか
— あぷろ (@elfmimi) 2014, 2月 15
OVRPlayerControllerを使っていれば何もせずとも動く。 これでDK2が来ても安心!
Let’s Hacking!
もう1台のOculusRiftもプレイヤーとして使ってみる
マルチプレイはとーってもおもしろい。表現の可能性が一気に広がる。
Photon使って実現することもできるが、Ocufesの会場にインターネット回線がないかもしれない。
ということで、ローカルで2Pプレイをやってみる。
課題としては次の2点
- ディスプレイにどうやって映すか?
- ヘッドトラッキングのセンサーの値をどうやって分離するか?
1. ディスプレイにどうやって映すか?
OculusRiftは映像をサイド・バイ・サイドに映して3Dを実現。
また、110°の視野角を確保するために樽型ひずみ( Barrel distortion
)で映像を収束してモニターに映し、レンズを通して糸巻型ひずみ( Pincushion distortion
)で絵を広げることをやってのけたアイディア大賞の製品。
ここでポイントとなるのは絵をサイド・バイ・サイドで映しているところ。
対応方式としては、グローバルゲームジャムでやった @koukiwfさん発案のアプローチ
Unityでの具体的な設定方法
- OVRPlayerControllerを2つ
Scene
ビューに配置 Hierarchy
ビューでOVRCameraをアタッチしたGameObjectを選択し、Inspector
ビューで OVRPlayerControllerにそれぞれ2つあるOVRCamera、計4つのViewport Rect
を次のように修正。上に映すものは0.5
下は-0.5
2. ヘッドトラッキングのセンサーの値をどうやって分離するか?
- 次のような感じでソース改変
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); }
- 変更前
- 4つあるカメラのDepthを1から0へ(先ほどの画像にあるNOTE)
- 各OVRCameraControllerの
PlayerNO
を設定する。 1Pは0
を、2Pは1
を設定 - 実行
- 注意
USBの認識が不安定でOculusRiftが2台ともちゃんと認識しない場合がある。
確認方法としては、OculusRiftを2台接続してOVRPlayerController.Update
へDebug.Log (OVRDevice.SensorCount);
を追加して実行。
コンソールに2
と表示されることを確認する。1
であれば1台しか認識していないのでUSBを挿しなおすか、別のポートへ差し替えて実行し直す。
どうしてもダメならUSB3.0のハブ(ACアダプタつき)を買う。- 今回試したのはMacbook Proの左のポートへUSB3.0のハブをバスパワー駆動で接続。2台のOculusを両方共USB給電で接続して試した。(実は結構不安定で3回位接続しなおして動く