Oculus Quest 2のトラッキングで3Dモデルを自由に動かす方法、Camera位置をオフセットして快適な1人称視点にする方法を解説します。
環境
macOS Monterey 12.3.1
Unity 2021.3.2f1
Oculus Integration 39.0
Final IK 2.1
Oculus Quest 2
準備
インポートしておくもの
-
Oculus Integration
アセットストアにて無料で公開されています。 -
Final IK
有料アセットですが、セールのタイミングで購入するとお得に入手できます。 -
3D人物モデル
お好きなものをご用意ください。今回はBOOTHで販売されている「QuQuさんちのネコちゃん」と「エトワーニュ」を使用させて頂いています。
3DモデルとOVRPlayerControllerを配置する
ヒエラルキービューへドラッグ&ドロップし、シーン上に配置します。
OVRPlayerController > OVRCameraRig > CentreEyeAnchorにあるCameraコンポーネントが、HMD用のカメラとして使用されます。
元々あったMain Cemeraは不要なので削除しておきましょう。
Final IKで3点トラッキング
トラッキング用に空のオブジェクトを作る
OVRPlayerControllerの中にある CentreEyeAnchor, LeftHandAnchor, RightHandAnchor それぞれの中に空のオブジェクトを作成します。オブジェクトの名前は HeadTarget, LeftHandTarget, RightHandTargetとしました。
3DモデルにVR IKをアタッチし、トラッキングターゲット3点を設定
3DモデルにVR IKをAdd Componentした後、Head Targetと左右のHand Targetに先程作った空のオブジェクトをアタッチします。これだけで3DモデルをOculusの動きに対応させることができます。
カメラの調整
モデルの大きさをプレイヤーに合わせる
TransformのScaleで、3Dモデルの大きさを調整します。腕の長さを基準にすると良い操作感になりやすいです。
人の腕の長さは身長と大体同じなので、自分の身長と同じ大きさのCubeを用意して2Dモードで前後に並べると調整しやすくなります。
腕が短めのモデルだったので、腕の長さを寄せつつ身長とのバランスを取りました。
後に実機で確認しながら再調整したい項目です。
Oculus Quest 2 におけるカメラ座標
OVRPlayerController > OVRCameraRig に入っているOVR ManagerコンポーネントのTracking Origin Typeを、Floor Level
に設定します。選択項目3つを軽く解説すると下記のようになります。
-
Eye Level
ユーザーの身長に関わらず、指定した高さにカメラが設置されます。空から見下ろす場合などに選択します。 -
Floor Level
足元を原点としたカメラ座標になります。
身長が180cmの人では地上から180cmの高さに、身長が130cmの人では地上から130cmの高さにカメラが設置されます。地面に立っている場合などに選択します。 -
Stage
FloorLevelと同様に足元を原点としてカメラが設置されます。また、ユーザーによるセンタリングが反映されないという特徴があります。
決まった方向が前とみなされるので、現実のプレイエリアとリンクさせたアプリ開発などに使用できます。
モデルの頭がカメラに映らないように設定
現在の状態で実行するとモデルの頭の内側が描画されてしまうので、対策が必要となります。
モデルの頭と体が別のオブジェクトになっている場合は、レイヤーで頭を指定してカメラから非表示にする方法が確実です。Culling Mask
の項目からカメラに描画されるレイヤーを選択出来ます。
- 頭のオブジェクトのインスペクターで、Layer > Add Layer… をクリック
- 新規に専用のレイヤーを作成
- 頭のオブジェクトに戻り、先程作成した専用のレイヤーをアタッチ
- OVRPlayerController > OVRCameraRig > CenterEyeAnchorにあるCameraコンポーネントの
Culling Mask
のチェックボックスを開き、頭のオブジェクトにアタッチしたレイヤーのチェックを外す
頭が別になっていないモデルの場合は、次のレンダリング範囲の設定で改善できます。
エトワーニュのように頭の大きいモデルの場合はCulling Mask必須となりますが、頭の小さいモデルの場合は次の設定だけでも問題ありません。
レンダリングの範囲を設定
OVRPlayerController > OVRCameraRig > CenterEyeAnchorにあるCameraコンポーネントのClipping Planes > Nearを設定します。
「カメラから何m以内は描画しない」という意味の設定項目です。
モデルの体型や頭の大きさにより最適値が異なりますが、仮に0.2とします。
後に実機で確認しながら調整したい項目です。
現在の視点と目標とする視点
現在のカメラ座標は画像のように首の真上になっている為、下を見ると体の断面が覗く状態です。
カメラを本来の目の位置に合わせてオフセットする必要があります。
ただし細身のモデルの場合は調整がほとんど不要な場合もあります。
モデルの体型により最適値が異なるので、こちらも確認しながらの調整が必要な項目です。
カメラ座標のオフセット
CenterEyeAnchorの中に作った空のオブジェクトHeadTargetのTransformから、Positionを調整します。
画像のように、現在の視点と目標とする視点の差分を反転させた座標にオフセットします。
後ろにモデルが引っ張られることで、相対的にカメラが前に出たような位置関係を作ることができます。
↑こちらのモデルは細身なので、小さめの値で十分でした。
↑こちらのモデルは体の厚みがある為、大きめの値にします。
以上で、Oculus Quest 2で操作できる一人称視点の実装ができました。 理想的な視点になりましたが、こちらのモデルは手の角度が捩れてしまっているので続けて調整が必要です。
参考にさせて頂きました
モデルの体の捩れを調整する内容を含む、Final IKの解説記事です
こちらの記事で、ものを掴む機能の実装ができます
地形に合わせて足を設置させる方法が解説されています
下記記事も大変参考にさせて頂きました
https://qiita.com/pira/items/7121764bba7fc605426f
https://shinrinmusic.com/final-ik/
https://light11.hatenadiary.com/entry/2019/11/05/220200