本日はMetaQuestの学習枠です。
MetaHorizonの開発ドキュメントを読みながら実際に開発を行ってみました。
MetaHorizonの開発ドキュメント
MetaHorizonの開発ドキュメントを実際に手を動かしながら実行時のキャプチャをしていきます。
developers.meta.com
本記事は以下の「Capsenseを使用する」の記事の後半を試します。
developers.meta.com
サンプルシーン
SDKパッケージにはこの機能を使用するためのControllerDrivenHandPosesというUnityサンプルが含まれています。

OVRCameraRigプレハブ上のOVRManagerスクリプトには[Controller Driven Hand Poses Type]というenum(列挙型)セレクターが追加されています。
このenumには3つのオプションがあります。

None(なし)
ハンドトラッキングが有効な場合、手のポーズにはトラッキングカメラからのデータのみが反映されます。
Conforming To Controller(コントローラーに追従)
コントローラーのデータから生成される手のポーズは、コントローラーのモデル周辺に配置されます。
Natural(自然)
このオプションで生成される手のポーズはユーザーがコントローラーを握っていないかのようなより自然な状態に配置されます。
スクリプト
Capsenseを制御するための4つのC#スクリプト関数が提供されます。
void SetControllerDrivenHandPoses(bool)
コントローラーのデータを使用してハンドポーズを生成できるかどうかを設定します。
void SetControllerDrivenHandPosesAreNatural(bool)
コントローラーを握り込む形状ではなく自然なハンドポーズを生成するようアプリケーションから要求するかどうかを設定します。
bool IsControllerDrivenHandPosesEnabled()
ハンドポーズにコントローラーのデータを使用できるかどうかを確認します。
bool AreControllerDrivenHandPosesNatural()
コントローラーのデータから生成されるポーズがコントローラーを握り込む形状ではなく自然な形状であるかどうかを確認します。
ShowState
OVRControllerHelperとOVRHandに、ShowState列挙型(enum)が追加されています。利用可能なオプションは以下の通りです。

Always
コントローラーやハンドの状態に基づいてオブジェクトが自動的に無効化されることはありません。
Controller in Hand or no Hand
コントローラーがユーザーの手に保持されていない場合、またはハンドトラッキングが完全に無効化されている場合にこのオブジェクトは無効化されます。
Controller in Hand
コントローラーが現在ユーザーの手に保持されていない場合、このオブジェクトは無効化されます。
Controller Not in Hand
コントローラーがユーザーの手に保持されている場合、このオブジェクトは無効化されます。
これは、机の上に置かれている場合などコントローラーが手から離れている状況で使用されます。
No Hand
ハンドトラッキングが有効でかつ手が検出されている場合、このオブジェクトのレンダリングが無効化されます。
Capsense機能用の新しいアンカー
LeftControllerInHandAnchorおよびRightControllerInHandAnchorはそれぞれLeftHandAnchorおよびRightHandAnchorを親として配置されます。
これらのアンカーを使用するとユーザーがコントローラーを手に持っている間、手とコントローラーを同時にレンダリングできます。
各アンカーにOVRControllerPrefabを追加し、手に合わせて設定した上で[Show State(表示状態)]を[Controller In Hand(コントローラーを手持ち)]に設定してください。

LeftHandOnControllerAnchorとRightHandOnControllerAnchoはそれぞれLeftControllerInHandAnchorおよびRightControllerInHandAnchorを親として配置されています。
これらを使用することでコントローラーがユーザーの手に握られている間、手とコントローラーを同時に描画できます。
各アンカーにOVRHandPrefabプレハブを追加し、[Hand Type]を該当する手に合わせ、[Show State]を[Controller In Hand]に設定してください。

トラブルシューティング
ヘッドセットでCapsenseが動作していることを確認するにはどうすればよいですか?
ヘッドセットの画面上でコントローラーの代わりに「手」が表示されているか、あるいはコントローラーを「手」で持っている状態が表示されているはずです。
また、コントローラーを使用している間は手のポーズデータも取得できる状態になります。
Link経由でのCapSenseに関するトラブルシューティング
ここでは、特にLink経由でCapSenseを使用する際によくある問題点や注意点を挙げます。
OVRManagerは正しく設定されていますか?
シーン内のカメラリグにあるOVRManagerスクリプトを確認し、[Controller Driven Hands]プロパティが[Conforming To Controller]に設定されていることを確認してください。

適切なXRプラグインプロバイダーを選択していますか?
UnityのPlayer設定で[XR Plug-in Management]に移動し、関連するすべてのプラットフォーム(Questデバイスで動作させるためのAndroid、およびLink経由で動作させるためのPCのOS)に対して、Oculusプラグインプロバイダーが有効になっていることを確認してください。
必要なLink機能をすべて有効にしていますか?
開発用PC上のMeta Horizon Linkアプリで[Settings(設定) -> Developer(開発者)]に移動し、[Developer Runtime Features(開発者ランタイム機能)]の設定が有効になっていることを確認してください。

OVRHandの「Show State」は正しく設定されていますか?
カメラリグのOVRHandPrefab(OVRCameraRig > TrackingSpace > Left/RightHandAnchor > OVRHandPrefab)において、OVRHandスクリプトの[Show State]が[Controller in Hand]に設定されていることを確認してください。