OVRPlayerControllerを使ってカメラが足元にめり込む問題の解決
#oculus OVRPlayerController付けてUnityで再生すると、OVRCameraRigのLocalYpositionが-1されるの一体何?
— Yu (@yuma1217_ja) March 15, 2019
問題
Unity上でOVRPlayerControllerを使って再生すると、
VR上でのカメラ位置を表すOVRCameraRigのy座標が-1になる。
つまり、頭の位置が-1下がってしまう問題が発生。
OVRPlayerControllerにはカプセルコライダーが付いているため、コライダーの一番底くらいにカメラが配置され、足元にめり込む現象が起きて困った。
ちょっと調べてみた。
調査
まず、学びとして、OculusのForumで検索をかけてみるのが早いなって思った。
同じ問題が掲載されていた。
解決方法
OVRPlayerControllerにはUserProfileDataという設定項目がある。 ここがデフォルトではTrueになっているが、Falseに変える事で、上記の問題を無くすことが出来る。
理由
なにが起こってるかちょっと見てみると、UserProfileDataはOVRPlayerController.csのUpdateControllerメソッドで使われていて、
if (useProfileData) { // 一部抜粋 var p = CameraRig.transform.localPosition; // OVRCameraRigに付いているOVRManagerの設定項目 // デフォルトだとEyeLevelに設定 if (OVRManager.instance.trackingOriginType == OVRManager.TrackingOrigin.EyeLevel) { // この文が現象の胆だった、コメントアウトすると問題が消える p.y = OVRManager.profile.eyeHeight - (0.5f * Controller.height) + Controller.center.y; } CameraRig.transform.localPosition = p; }
CameraRigのlocalPositionを変更しているpというパラメータを追っていくと、
p.y = OVRManager.profile.eyeHeight - (0.5f * Controller.height) + Controller.center.y;
ここでy座標をがっつりいじってる。
デバッグをしてみると、
常にこの値が表示された。上の式に代入してみれば-1なので、問題はここだったんだろう。
OVRManager.profileを見てみると
Gets the current profile, which contains information about the user's settings and body dimensions.
Oculusユーザーの身体情報を取って使うデータのよう。
Oculusを始める際、身長などを入れたと思うけど、そのデータを使って、見え方を最適化できるものっぽい。
それがUnity側には存在しないから、今回のような問題が起こったのかなぁって思った。
まとめ
Unity側では常にUserProfileDataの項目は切っておいて良さそう。