OVRPlayerControllerを使ってカメラが足元にめり込む問題の解決

問題

Unity上でOVRPlayerControllerを使って再生すると、 VR上でのカメラ位置を表すOVRCameraRigのy座標が-1になる。
つまり、頭の位置が-1下がってしまう問題が発生。
OVRPlayerControllerにはカプセルコライダーが付いているため、コライダーの一番底くらいにカメラが配置され、足元にめり込む現象が起きて困った。
ちょっと調べてみた。

調査

forums.oculusvr.com

まず、学びとして、OculusのForumで検索をかけてみるのが早いなって思った。
同じ問題が掲載されていた。

解決方法

OVRPlayerControllerにはUserProfileDataという設定項目がある。 f:id:yuma1217:20190316163015p:plain ここがデフォルトでは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座標をがっつりいじってる。 デバッグをしてみると、

f:id:yuma1217:20190316165118p:plain

常にこの値が表示された。上の式に代入してみれば-1なので、問題はここだったんだろう。
OVRManager.profileを見てみると

Gets the current profile, which contains information about the user's settings and body dimensions.

Oculusユーザーの身体情報を取って使うデータのよう。
Oculusを始める際、身長などを入れたと思うけど、そのデータを使って、見え方を最適化できるものっぽい。
それがUnity側には存在しないから、今回のような問題が起こったのかなぁって思った。

まとめ

Unity側では常にUserProfileDataの項目は切っておいて良さそう。