Meta Avatars SDK for Unity (3)|OVRPlayerController 連携の実装方法(コントローラ操作版)

本記事では Meta Avatars SDKアバターを OVRPlayerController で動作制御できるようにし,
HMDとコントローラの位置をトラッキング出来るように実装します.

f:id:xrdnk:20220109201943j:plain

検証環境・前提条件

  • Unity 2020.3.25f1
  • Meta Avatars SDK 9.0
  • Oculus Integration 35.0

Meta Avatars SDK は現時点では Unity 2020 LTS が前提となっています.

検証用シーン作成

Meta Avatars SDK と Oculus Integration がインストール済であることを前提に進めます.
インストール方法は下記の記事を参照ください.

xrdnk.hateblo.jp

静的環境の作成

適当なシーンを作ります.シーン名は 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 を当てはめます.

f:id:xrdnk:20220109193650j:plain

OVRPlayerController の設置

Main Camera を削除し,Assets/Oculus/VR/Prefabs/OVRPlayerController.prefabヒエラルキーに置きます.

f:id:xrdnk:20220109193930j:plain

OVRAvatarManager 関連のカスタマイズ

Meta Avatars を使えるようにするためには OVRAvatarManager が必ず必要になります.
OVRAvatarManager は Meta Avatars 関連の処理を多く司るクラスで機能を全て紹介すると大変なので割愛します.
サンプルにいい感じのプレハブがあるので,それをカスタマイズします.

Assets/Oculus/Avatar2/Example/Common/Prefabs/AvatarSdkManagerHorizon.prefabヒエラルキーに置きます.
その後,Sample Input Manager コンポーネントを外します.名前も「CustomOVRAvatarManager」に変更します.
以下のようになっていればよいです.

f:id:xrdnk:20220109194511p:plain

この状態で Unpack Completely をしてください.

f:id:xrdnk:20220109194609p:plain

OvrAvatarEntity 関連のカスタマイズ

OVRPlayerController/OVRCameraRig/TrackingSpace を親として,空オブジェクトを作ります.
名前は「MetaAvatarEntity」とします.MetaAvatarEntity に SampleAvatarEntity コンポーネントをアタッチします.

f:id:xrdnk:20220109194939p:plain

SampleAvatarEntity は OvrAvatarEntity を継承しているクラスです.OvrAvatarEntity が Meta Avatar の実体のようなものです.
OvrAvatarEntity は Meta Avatar の読込処理,Oculus Platform 関連の初期化処理などを司ります.
OvrAvatarEntity も OvrAvatarManager と同じく機能が多いので,今回は詳細説明を割愛します.

MetaAvatarEntity オブジェクトの配置は「TrackingSpace」の子であることはマストです.
守らなかった場合は,トラッキングの座標計算が狂い,アバターが想定外の動きをします.

OvrAvatarBodyTrackingBehaviour の独自実装

Meta AvatarHMD とコントローラの動きをトラッキングできるようにするためには,
OvrAvatarEntity の TrackingInput/BodyTracking に
OvrAvatarBodyTrackingBehavior 継承コンポーネントを登録する必要があります.

f:id:xrdnk:20220109195614p:plain

OVRPlayerController 連携用に OvrAvatarBodyTrackingBehavior 継承コンポーネントを作成したので,
下記にサンプルスクリプトを記します.処理の内容についてはスクリプト内にあるコメントを参照ください.
継承関係は OvrAvatarBodyTrackingBehaviour ← OvrAvatarInputManager ← CustomOvrAvatarControllerInputManager です.

これを CustomOVRAvatarManager オブジェクトにアタッチします.
Use Async Body Solver をチェックするかどうかは自由ですが,
チェックすると最初は1フレーム程度遅延が生じるものの,その後はパフォーマンスがよくなるっぽいです.

f:id:xrdnk:20220109200853p:plain

SampleAvatarEntity の TrackingInput/BodyTracking に CustomOvrAvatarControllerInputManager コンポーネントを登録します.

f:id:xrdnk:20220109201154p:plain

以上で一旦実装は完了です.

動作確認

Air Link で動作確認してみます.

gyazo.com

左コントローラのジョイスティックを動かすと位置移動処理ができ,
右コントローラのジョイスティックを動かすとカメラ回転処理が出来るようになっています.
また,ボタンを押したり触れたりすると指が動いたり,コントローラを動かすと腕の位置がトラッキングできるようになっています.