CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

【Unity】OVRPlayerControllerのカメラrotationを変更する方法

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);			
	}
}


今のところこんな感じです。

OVRPlayerControllerのCamera Rotationを変更した結果

赤か青の糸を出して、生成した蜘蛛の巣の場所まで移動する、まではできました。まだいくつかバグが残っているので、あと一週間で仕上げていきたいと思います。

3. 補足

今回、検証用にカメラアングルを変更して見ました。ただし、VRにおいてCameraを激しく動かすと、体験者に酔いを生じさせます。出展時にはこの方法は使わない方がよいのでご注意ください。