Meta Avatars SDK for Unity (3)|OVRPlayerController 連携の実装方法(コントローラ操作版)
本記事では Meta Avatars SDK のアバターを OVRPlayerController で動作制御できるようにし, HMDとコントローラの位置をトラッキング出来るように実装します.
検証環境・前提条件
- Unity 2020.3.25f1
- Meta Avatars SDK 9.0
- Oculus Integration 35.0
Meta Avatars SDK は現時点では Unity 2020 LTS が前提となっています.
検証用シーン作成
Meta Avatars SDK と Oculus Integration がインストール済であることを前提に進めます. インストール方法は下記の記事を参照ください.
静的環境の作成
適当なシーンを作ります.シーン名は MetaAvatarsUsingOVRPlayerController
としました.
Plane を作って Position を (0, -1, 0),Scale を (2, 2, 2) にします.
マテリアルは Assets/Oculus/SampleFramework/Usage/Locomotion/Materials/MAT_floor_wood_01.mat
を使います.
Skybox も一応設定します.Window > Rendering > Lighting から Environment タブに移動し,
Skybox Material に Assets/Oculus/Avatar2/Example/Scenes/VenuesLobbyLightingExample/VenuesLobby Skybox.mat
を当てはめます.
OVRPlayerController の設置
Main Camera を削除し,Assets/Oculus/VR/Prefabs/OVRPlayerController.prefab
をヒエラルキーに置きます.
OVRAvatarManager 関連のカスタマイズ
Meta Avatars を使えるようにするためには OVRAvatarManager が必ず必要になります. OVRAvatarManager は Meta Avatars 関連の処理を多く司るクラスで機能を全て紹介すると大変なので割愛します. サンプルにいい感じのプレハブがあるので,それをカスタマイズします.
Assets/Oculus/Avatar2/Example/Common/Prefabs/AvatarSdkManagerHorizon.prefab
をヒエラルキーに置きます.
その後,Sample Input Manager コンポーネントを外します.名前も「CustomOVRAvatarManager」に変更します.
以下のようになっていればよいです.
この状態で Unpack Completely をしてください.
OvrAvatarEntity 関連のカスタマイズ
OVRPlayerController/OVRCameraRig/TrackingSpace を親として,空オブジェクトを作ります. 名前は「MetaAvatarEntity」とします.MetaAvatarEntity に SampleAvatarEntity コンポーネントをアタッチします.
SampleAvatarEntity は OvrAvatarEntity を継承しているクラスです.OvrAvatarEntity が Meta Avatar の実体のようなものです. OvrAvatarEntity は Meta Avatar の読込処理,Oculus Platform 関連の初期化処理などを司ります. OvrAvatarEntity も OvrAvatarManager と同じく機能が多いので,今回は詳細説明を割愛します.
MetaAvatarEntity オブジェクトの配置は「TrackingSpace」の子であることはマストです. 守らなかった場合は,トラッキングの座標計算が狂い,アバターが想定外の動きをします.
OvrAvatarBodyTrackingBehaviour の独自実装
Meta Avatar が HMD とコントローラの動きをトラッキングできるようにするためには, OvrAvatarEntity の TrackingInput/BodyTracking に OvrAvatarBodyTrackingBehavior 継承コンポーネントを登録する必要があります.
OVRPlayerController 連携用に OvrAvatarBodyTrackingBehavior 継承コンポーネントを作成したので, 下記にサンプルスクリプトを記します.処理の内容についてはスクリプト内にあるコメントを参照ください. 継承関係は OvrAvatarBodyTrackingBehaviour ← OvrAvatarInputManager ← CustomOvrAvatarControllerInputManager です.
これを CustomOVRAvatarManager オブジェクトにアタッチします. Use Async Body Solver をチェックするかどうかは自由ですが, チェックすると最初は1フレーム程度遅延が生じるものの,その後はパフォーマンスがよくなるっぽいです.
SampleAvatarEntity の TrackingInput/BodyTracking に CustomOvrAvatarControllerInputManager コンポーネントを登録します.
以上で一旦実装は完了です.
動作確認
Air Link で動作確認してみます.
左コントローラのジョイスティックを動かすと位置移動処理ができ, 右コントローラのジョイスティックを動かすとカメラ回転処理が出来るようになっています. また,ボタンを押したり触れたりすると指が動いたり,コントローラを動かすと腕の位置がトラッキングできるようになっています.