This document is about: FUSION 2
SWITCH TO

Meta OVR hands synchronization


Available in the Industries Circle
Circle
Fusion Industries プロトタイピングアドオン

このアドオンは、Meta OVR Handsの手の状態(フィンガートラッキング含む)を同期する方法を示します。

手は以下のいずれかで表示できます。

  • 掴んでいるコントローラーから受け取るデータ
  • フィンガートラッキングのデータ

フィンガートラッキングのデータに関しては、手のボーンのデータを高圧縮して帯域消費を削減する方法を示しています。

Meta OVR hands synchronization

Meta XR SDK

他のサンプルで使用されているOpenXRプラグインのかわりに、ここではOculus XRプラグインを使用しています。
Meta XR Core SDKを使用する場合は、複合現実のパススルーと共有空間アンカーを有効にすることが推奨されます。

Meta XR SDKは、MetaのScoped Registry https://npm.developer.oculus.com/ に追加されています。(詳細はMeta documentationを参照)

Metaからインストールしたパッケージには以下が含まれます。

  • Meta XR Core SDK:複合現実のパススルーと共有空間アンカーに必要です。また、フィンガートラッキングAPIとクラスを提供しています。
  • Meta XR Platform SDK:Oculus User IDへアクセスして、共有空間アンカーの登録プロセスで使用されます。(必須ではありませんが、例えば、プロジェクトで共有空間アンカーやMetaアバターを使用する場合は必須になります)

Oculusリグとビルディングブロック

OpenXRプラグインのかわりにOculus XRプラグイン使用する場合は、入力やフィンガートラッキングと同様に、ヘッドセットと手の位置をキャプチャするために特定のリグが作成されます。

このハードウェア収集リグは、Meta building blocksから作成されます。

  • このステップで作成されるプレハブは、/Prefabs/Rig/BaseBuildingBlocks/[BuildingBlock] BaseRigプレハブから利用可能です
  • アドオンで実際に使用するプレハブは、同期コンポーネントが追加されていて、/Prefabs/Rig/[BuildingBlock] HardwareRigプレハブから利用可能です
Meta's building block based rig

それから、VRSharedサンプルで使用されている同じコンポーネントで、ヘッドセットと手の位置の収集と同期が行われます。(VR SharedページのHardwareRigHardwareHandを参照)

最後に、以下で説明されるような特定のコンポーネントが追加され、フィンガートラッキングと、フィンガートラッキングとコントローラートラッキングの手の表現の切り替えの制御が可能になります。

手のロジックの概要

このアドオンは、コントローラーベースのハンドトラッキングとフィンガーベースのハンドトラッキングが共存できます。一方からもう一方へシームレスに移行できるようにすることが目的です。

  • 他のVRサンプルのように、コントローラーを使用する場合、手のモデルはOculust Sample Frameworkで表示されます。
  • フィンガートラッキングを使用する場合、ローカルユーザーでは、Meta XR Core SDKのOVRHandコンポーネントが手と指のボーンデータを収集して、OVRSkeletonが指のボーンのゲームオブジェクトを、OVRMeshOVRMeshRendererがボーンのSkinnedMeshRendererに使用されます。これらはすべて、ビルディングブロックのセットアップで使用可能になります。MetaのSet Up Hand Trackingのドキュメントページも参考にしてください。
  • リモートユーザーでは、RemoteOVRHand(後述)がOVRSkeletonの手と指のボーンの位置データを復元して、OVRMeshOVRMeshRendererが同様の方法で手を再構成します。
  • いくつかの手の状態は、リングバッファで保存されます。Render毎に、これらの2つの状態間を補間して、2ティック間のボーンの回転をスムーズに表示します。
Hand logic overview
Hand RemoteHand logic

備考
OVRSkeletonOVRMeshOVRMeshRendererクラスは現在、特定のデバッグ問題により、エディター上でリモートユーザーを完全に使用することはできません。詳細はこちらをご覧ください。

これを回避するため、プロジェクトではRemoteOVRSkeletonRemoteOVRMeshRemoteOVRMeshRendererのコピーを使用し、問題のエディター関連のコードを単純に削除しています。

Meta Packageの更新によって新しいコードとの互換性が失われた場合、更新部分を安全に置き換えることができます。

ローカルのハードウェアリグの手コンポーネント

Local hardware rig hand components

ローカルユーザーのハードウェアリグの手にあるHardwareOVRHandCollecterコンポーネントは、手の状態を収集して同期を行います。
手の状態(特に指のボーンの回転を含む)にアクセスするため、MetaのOVRHandコンポーネントに依存しています。

また、これにはピンチ状態にアクセスしたり、現在フィンガートラッキングが使用されているかを知るための補助プロパティも含まれています。

ネットワークリグの手コンポーネント

RemoteOVRHand

ローカルユーザーのネットワークリグのRemoteOVRHandコンポーネントはHardwareOVRHandCollecterに依存していて、ローカルの手の状態を見つけてFixedUpdateNetwork内でネットワーク変数に保存します。

リモートユーザーでは、その同期データをパースしてRender内でローカルの手の状態を再構築し、実際のボーンのtransformと手のメッシュの状態を制御しているRemoteOVRSkeletonRemoteOVRMeshRemoteOVRMeshRendererコンポーネントで使用されます。

同期された手の状態は、ボーンの情報とIsDataValidを含み、ユーザーがフィンガートラッキングを使用しているならtrue、そうでなければfalseを返します。

帯域幅の最適化

ボーン情報の転送は非常に高コストで、同期する手の状態には24個のQuaternionが含まれます。これを同期する簡単なアプローチは、すべてのQuaternionを通信することで、帯域消費は削減されませんが動作はします。これはRemoteOVRHandの別バージョンのUncrompressedRemoteOVRHandでテストできます。

実際のRemoteOVRHandの実装では、手のボーンのプロパティ(特定の回転軸、可動域の制限など)を使用して、必要な帯域幅を削減しています。各ボーンの精度は、専用のHandSynchronizationScriptableで指定(HardwareOVRHandCollecterRemoteOVRHandの両方で提供される必要があります)できます。

このアドオンではデフォルトのものとしてHandSynchronizationConfigForCompressedMetaOVRHandsがあり、大抵のニーズに合うように作られています。

  • 圧縮率が非常に高く、約20分の1のバイトを使用する(手のボーンの回転を、完全なQuaternionを386bytesで転送するかわりに19bytesで保存します)。無圧縮の転送はHandSynchronizationConfigForMetaOVRHandsでテストできます。
  • 圧縮によって、リモートユーザーの手の表現に悪影響を与えない。

補間

RemoteOVRHandsでは、各Render内のParseNetworkData()でネットワークデータの変更を検知します。ネットワークデータの値は、圧縮された手の状態に変換され、実際の手の状態は手のスケルトンをアニメーションさせるために使用できます。

この手の状態は、時間付きリングバッファ(手の状態と追加された時間を保存するリングバッファ)に保存されます。

それから各Render内で、ボーンをアニメーションするために実際に使用される手の状態がInterpolateBonesRotationsで計算されます。ここで、リングバッファに保存されている特定間隔の2つの手の状態間が補間されます。
これによって、ティック間でも、手のボーンはシームレスに回転するようになります。

手のモデルの切り替え

OVRHandRepresentationManagerコンポーネントは、現在使用中のハンドトラッキングモードに基づいて、どの手のメッシュを表示するかを制御します。

  • コントローラートラッキング使用時は、Oculus Sample Frameworkの手のメッシュ
  • フィンガートラッキング使用時は、OVRSkeletonコンポーネントのロジックによってアニメーションするボーンのスケルトンに依存するメッシュ

これはまた、アバターの肌の色(Avatarアドオンで提供されるIAvatarRepresentationListenerで実装される)に基づいて、手の色を適用します。

このスクリプトには2つのバージョンが存在し、1つはローカルハードウェアの手(手のスケルトンのアニメーションでの使用、ローカルの当たり判定目的、またはオフラインの手が必要な場合)、1つはネットワークの手です。

ローカルのハードウェアリグの手

このバージョンは、ハードウェアの手にあるOVRHandsに依存しています。

他の機能に加えて、2つのグラブのCollider間の切り替えの確認も行います。1つはフィンガートラッキング使用時の掌のローカルの位置、1つはコントローラーベースのトラッキング使用時の掌のローカルの位置です。(2つのモード間で、手の「中心」は全く同じ位置ではありません)これは、2つの人差し指先のColliderと同じです。

備考
現在の設定では、ネットワークの手の表示のみが選択されます。ハードウェアリグの手は、ボーンの位置を収集して、適切に人差し指のColliderの位置をアニメーションするためだけにあります。
したがって、ハードウェアの手に使用されるマテリアルは透過です(描画が無効になっている場合は、アニメーションでボーンは動きません)。
ハードウェアの手のメッシュは、HardwareOVRHandRepresentationManagerMaterialOverrideModeOverrideに設定されていれば、overrideMaterialForRenderersフィールドで与えられた透過マテリアルによって、自動的に透過に設定されます。

ネットワークリグの手

NetworkOVRHandRepresentationManagerコンポーネントは、手のモードに基づいて、どのメッシュを表示するかを制御します。コントローラートラッキング使用時はOculus Sample Frameworkの手のメッシュ(RemoteOVRHandデータでチェックする)、またはOVRHandロジックに依存したメッシュです。

NetworkHand

依存関係

  • Avatar addon 2.0.2
  • Meta XR Core SDK

ダウンロード

このアドオンの最新バージョンは、Industries アドオンのプロジェクトに含まれています。

対応するトポロジー

  • 共有モード

更新履歴

  • Version 2.0.0: First release
Back to top