Meta OVR hands synchronization
このアドオンは、Meta OVR Handsの手の状態(フィンガートラッキング含む)を同期する方法を示します。
手は以下のいずれかで表示できます。
- 掴んでいるコントローラーから受け取るデータ
- フィンガートラッキングのデータ
フィンガートラッキングのデータに関しては、手のボーンのデータを高圧縮して帯域消費を削減する方法を示しています。
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
プレハブから利用可能です
それから、VRSharedサンプルで使用されている同じコンポーネントで、ヘッドセットと手の位置の収集と同期が行われます。(VR SharedページのHardwareRig
とHardwareHand
を参照)
最後に、以下で説明されるような特定のコンポーネントが追加され、フィンガートラッキングと、フィンガートラッキングとコントローラートラッキングの手の表現の切り替えの制御が可能になります。
手のロジックの概要
このアドオンは、コントローラーベースのハンドトラッキングとフィンガーベースのハンドトラッキングが共存できます。一方からもう一方へシームレスに移行できるようにすることが目的です。
- 他のVRサンプルのように、コントローラーを使用する場合、手のモデルはOculust Sample Frameworkで表示されます。
- フィンガートラッキングを使用する場合、ローカルユーザーでは、Meta XR Core SDKの
OVRHand
コンポーネントが手と指のボーンデータを収集して、OVRSkeleton
が指のボーンのゲームオブジェクトを、OVRMesh
とOVRMeshRenderer
がボーンのSkinnedMeshRenderer
に使用されます。これらはすべて、ビルディングブロックのセットアップで使用可能になります。MetaのSet Up Hand Trackingのドキュメントページも参考にしてください。 - リモートユーザーでは、
RemoteOVRHand
(後述)がOVRSkeleton
の手と指のボーンの位置データを復元して、OVRMesh
とOVRMeshRenderer
が同様の方法で手を再構成します。 - いくつかの手の状態は、リングバッファで保存されます。
Render
毎に、これらの2つの状態間を補間して、2ティック間のボーンの回転をスムーズに表示します。
備考:
OVRSkeleton
・OVRMesh
・OVRMeshRenderer
クラスは現在、特定のデバッグ問題により、エディター上でリモートユーザーを完全に使用することはできません。詳細はこちらをご覧ください。
これを回避するため、プロジェクトではRemoteOVRSkeleton
・RemoteOVRMesh
・RemoteOVRMeshRenderer
のコピーを使用し、問題のエディター関連のコードを単純に削除しています。
Meta Packageの更新によって新しいコードとの互換性が失われた場合、更新部分を安全に置き換えることができます。
ローカルのハードウェアリグの手コンポーネント
ローカルユーザーのハードウェアリグの手にあるHardwareOVRHandCollecter
コンポーネントは、手の状態を収集して同期を行います。
手の状態(特に指のボーンの回転を含む)にアクセスするため、MetaのOVRHand
コンポーネントに依存しています。
また、これにはピンチ状態にアクセスしたり、現在フィンガートラッキングが使用されているかを知るための補助プロパティも含まれています。
ネットワークリグの手コンポーネント
ローカルユーザーのネットワークリグのRemoteOVRHand
コンポーネントはHardwareOVRHandCollecter
に依存していて、ローカルの手の状態を見つけてFixedUpdateNetwork
内でネットワーク変数に保存します。
リモートユーザーでは、その同期データをパースしてRender
内でローカルの手の状態を再構築し、実際のボーンのtransform
と手のメッシュの状態を制御しているRemoteOVRSkeleton
・RemoteOVRMesh
・RemoteOVRMeshRenderer
コンポーネントで使用されます。
同期された手の状態は、ボーンの情報とIsDataValid
を含み、ユーザーがフィンガートラッキングを使用しているならtrue
、そうでなければfalse
を返します。
帯域幅の最適化
ボーン情報の転送は非常に高コストで、同期する手の状態には24個のQuaternion
が含まれます。これを同期する簡単なアプローチは、すべてのQuaternion
を通信することで、帯域消費は削減されませんが動作はします。これはRemoteOVRHand
の別バージョンのUncrompressedRemoteOVRHand
でテストできます。
実際のRemoteOVRHand
の実装では、手のボーンのプロパティ(特定の回転軸、可動域の制限など)を使用して、必要な帯域幅を削減しています。各ボーンの精度は、専用のHandSynchronizationScriptable
で指定(HardwareOVRHandCollecter
とRemoteOVRHand
の両方で提供される必要があります)できます。
このアドオンではデフォルトのものとして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
の位置をアニメーションするためだけにあります。
したがって、ハードウェアの手に使用されるマテリアルは透過です(描画が無効になっている場合は、アニメーションでボーンは動きません)。
ハードウェアの手のメッシュは、HardwareOVRHandRepresentationManager
のMaterialOverrideMode
がOverride
に設定されていれば、overrideMaterialForRenderers
フィールドで与えられた透過マテリアルによって、自動的に透過に設定されます。
ネットワークリグの手
NetworkOVRHandRepresentationManager
コンポーネントは、手のモードに基づいて、どのメッシュを表示するかを制御します。コントローラートラッキング使用時はOculus Sample Frameworkの手のメッシュ(RemoteOVRHand
データでチェックする)、またはOVRHand
ロジックに依存したメッシュです。
依存関係
- Avatar addon 2.0.2
- Meta XR Core SDK
ダウンロード
このアドオンの最新バージョンは、Industries アドオンのプロジェクトに含まれています。
対応するトポロジー
- 共有モード
更新履歴
- Version 2.0.0: First release