UnityでOculus用のソフトを起動させると、カメラが向く方向は地面と垂直になります。これを、ソフト起動中に任意の指示でタイトルの画像のように変更する方法を整理しました。
1.変更箇所と制限事項
結論から言うと、OVR/Scripts/OVRPlayerController.csのSetCamera()メソッドのOrientationOffsetという変数を変更する必要があります。
OrientationOffsetは、デフォルトだと常に初期値 Quaternion.identityのままなので、例えば、
transform.rotation = Quaternion.Euler(0,0,90); OrientationOffset = transform.rotation;
のように向きを変えてやると、カメラの向きも変わります。
Oculus抜きの単眼FPSでは、適切な場所で
transform.rotation = Quaternion.Euler(0,0,90);
を指定すれば向きは変わるのですが、Oculusの場合は下記コメント文のように、何か制限をかけているらしく、適当にやっただけでは向きの変更ができませんでした。
//OVRPlayerController.cs / UpdatePlayerForwardDirTransform()メソッドの宣言手前のコメント文 // UpdatePlayerControllerRotation // This function will be used to 'slide' PlayerController rotation around based on // CameraController. For now, we are simply copying the CameraController rotation into // PlayerController, so that the PlayerController always faces the direction of the // CameraController. When we add a body, this will change a bit..
2.変更方法
今回の場合、スパイダーマン風の動きを再現するときに、壁に張り付いたときだけカメラの向きを傾けるようにしたかったので、こんな感じのコードを作りました。
別処理で、壁に張り付いたときにrotationFlagをtrueにしています。
//OVRPlayerController.cs // SetCameras public void SetCameras(){ if(CameraController != null){ if(rotationFlag == true) { transform.rotation = Quaternion.Euler(0,0,90); OrientationOffset = transform.rotation; }else{ OrientationOffset = Quaternion.identity; } // Make sure to set the initial direction of the camera // to match the game player direction CameraController.SetOrientationOffset(OrientationOffset); CameraController.SetYRotation(YRotation); } }
今のところこんな感じです。
赤か青の糸を出して、生成した蜘蛛の巣の場所まで移動する、まではできました。まだいくつかバグが残っているので、あと一週間で仕上げていきたいと思います。
3. 補足
今回、検証用にカメラアングルを変更して見ました。ただし、VRにおいてCameraを激しく動かすと、体験者に酔いを生じさせます。出展時にはこの方法は使わない方がよいのでご注意ください。