Oculus(Unity)のカメラrotationを変更する方法

UnityでOculus用のソフトを起動させると、カメラが向く方向はこんな感じになります。

f:id:Takyu:20130914144923p:plain


これを、ソフト起動中に任意の指示でこんな風に変更したいと思って、その方法を探しました。

f:id:Takyu:20130914145014p:plain


結論から言うと、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..


今回の場合、スパイダーマン風の動きを再現するときに、壁に張り付いたときだけカメラの向きを傾けるようにしたかったので、こんな感じのコードを作りました。
別処理で、壁に張り付いたときに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);			
	}
}


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

f:id:Takyu:20130914150541p:plain

赤か青の糸を出して、生成した蜘蛛の巣の場所まで移動する、まではできました。

まだいくつかバグが残っているので、あと一週間で仕上げていきたいと思います。