This document is about: FUSION 2
SWITCH TO

Meta OVR hands synchronization


Available in the Industries Circle
Circle
Fusion行業原型附加元件

這個附加元件展示了同步Meta的OVR手的手狀態的方法(包含手指追蹤)。

它可以從兩者之一顯示手:

  • 從已拿取的控制器接收的資料
  • 從手指追蹤資料。

關於手指追蹤資料,附加元件展示了如何高度壓縮手骨資料,以減少頻寬耗用。

Meta OVR hands synchronization

Meta XR SDK

這裡使用Oculus XR外掛程式,而非其他範例中使用的OpenXR外掛程式。
建議在使用Meta XR Core SDK時使用,這是啟用混合實境直通和共享空間錨所必需的。

已經透過其有限範圍登錄https://npm.developer.oculus.com/(請參見Meta文檔以取得更多細節)來新增Meta XR SDK。

來自Meta登錄的主要的已安裝套件是:

  • Meta XR核心SDK:混合實境直通和共享空間錨所需。也提供手指追蹤API及類別。
  • Meta XR平台SDK:為了存取Oculus使用者ID,用於共享空間錨註冊流程(這個附加元件不需要,但是舉例而言如果專案使用共享空間錨或Meta虛擬人偶的話就需要)。

Oculus裝備及組建方塊

基於Oculus XR外掛程式而非OpenXR外掛程式,已經建立一個特定的裝備來捕捉頭戴式裝置及手位置,以及輸入或手指追蹤的細節資訊。

已經透過Meta組建方塊來建立這個硬體收集裝置:

  • 這個步驟產生的預製件在/Prefabs/Rig/BaseBuildingBlocks/[BuildingBlock] BaseRig預製件中可用。
  • /Prefabs/Rig/[BuildingBlock] HardwareRig預製件中,提供了附加元件中實際使用的預製件,以及新增到前一個附加元件的同步元件。
Meta's building block based rig

然後,使用了用於VR共享範例的收集和同步頭戴式裝置及手位置的相同的元件(請參見VR共享頁面中的HardwareRigHardwareHand)。

最後,新增一些特定元件以處理手追蹤,及切換手追蹤及控制器追蹤手代表,如同下述。

手邏輯概述

這個附加元件讓基於控制器的手追蹤及基於手指的手追蹤共存。目標是在彼此之間有一個平順的轉換。

為了做到這點:

  • 如同在其他VR範例中,當使用控制器時,顯示的手模型是來自Oculus範例框架。
  • 當使用手指追蹤時,針對本機玩家,Meta XR核心SDK的OVRHand元件收集手及手指骨資料,OVRSkeleton準備手指骨遊戲物件,而OVRMeshOVRMeshRenderer以這些骨來準備附有皮膚的網格轉譯器。所有這些都可以從建議的組建方塊設定中獲得。或者您可以在Meta的設定手追蹤文檔頁面找到詳細說明
  • 針對遠端使用者,一個RemoteOVRHand(詳見下述)從網路中復原與OVRSkeletonOVRMeshOVRMeshRenderer期望相同的手及手指骨資料,以相同的方式重新組建手
  • 這些手狀態中的其中幾個在接收時儲存在環緩衝之中。在每個Render期間,我們在過去的2個狀態之間以恆定的延遲來進行內插補點,以顯示平順的骨旋轉,甚至在2個刷新之間也是如此。
Hand logic overview
Hand RemoteHand logic

注意事項
OVRSkeletonOVRMeshOVRMeshRenderer類別對於遠端使用者,目前不能完美地用於編輯器之中,這是因為特定的偵錯問題,將在此說明。

為了繞過它,專案使用了它們的複本RemoteOVRSkeletonRemoteOVRMeshRemoteOVRMeshRenderer,其簡單地移除了有問題的只能用於編輯器的命令列。

如果一個Meta套件更新讓它們與新的程式碼基礎無法相容,您可以透過它們的原始副本來安全地替換它們。

本機硬體裝備手元件

Local hardware rig hand components

HardwareOVRHandCollecter元件位於本機使用者硬體裝備的手上,其收集手狀態來提供它到同步元件。
它相依於Meta的OVRHand元件,以存取手狀態(特別是包含手指骨旋轉)。

它也包含協助工具屬性以存取捏狀態,或了解目前是否使用手指追蹤。

網路裝備手元件

RemoteOVRHand

在本機使用者網路裝備上的RemoteOVRHand相依於HardwareOVRHandCollecter,以找到本機手狀態,並且隨後在FixedUpdateNetwork期間儲存它在網路變數之中。

針對遠端使用者,這些資料被剖析以重新建立一個本機手狀態,其隨後用於回答RemoteOVRSkeletonRemoteOVRMeshRemoteOVRMeshRenderer元件,這些處理實際骨轉換及手網格狀態。

已同步手狀態特別包含IsDataValid,如果使用者使用手指追蹤則為真,其他情況則為偽,以及包含骨資訊。

頻寬最佳化

骨資訊的傳輸非常耗用頻寬:手狀態包含24個四元數以進行同步。這個同步的一個簡單方法,就是傳輸所有四元數,並沒有嘗試減少頻寬耗用,但是是有效的,並且可以用RemoteOVRHandUncrompressedRemoteOVRHand替代版本測試它。

實際的RemoteOVRHand執行方式使用手骨的一些屬性(特定的旋轉軸、有限的移動範圍等等)以減少所需頻寬。針對各個骨所需的精確度水平可以在一個專用的HandSynchronizationScriptable可指令碼中指定(其必須提供到HardwareOVRHandCollecterRemoteOVRHand)。

附加元件包含一個預設的HandSynchronizationConfigForCompressedMetaOVRHands,其已經被組建以匹配大多數需求:

  • 它提供一個非常高的壓縮,使用少20倍的位元組(對於一個完整四元數傳輸,一隻手全骨旋轉設定只儲存在18位元組而非386位元組)。可以透過HandSynchronizationConfigForMetaOVRHands可指令碼來測試一個完整四元數傳輸。
  • 壓縮對遠端使用者的手指的代表沒有任何可見的影響。

內插補點

RemoteOVRHands上,在ParseNetworkData()中偵測網路資料的更改的各個Render期間,網路資料值被轉換成一個已壓縮手狀態,然後隨後轉換成一個實際手狀態,其可用於手骨架的動畫。

這個手狀態隨後儲存在一個限時的環緩衝之中(一個手狀態的環緩衝,其中我們也儲存插入時間)。

然後在各個轉譯期間,在InterpolateBonesRotations中計算實際用於骨動畫的手狀態。它在過去的指定延遲左右的時間的環緩衝中儲存的2個手狀態之間進行內插補點。
這樣的話,就算在刷新接收之間,手骨都可以在已接收旋轉值之間平順地旋轉。

切換手模型

OVRHandRepresentationManager元件處理針對手顯示的網格,這是基於目前使用的手追蹤模式:

  • 使用控制器追蹤時的Oculus範例框架手網格,
  • 或使用手指追蹤時,網格相依於由OVRSkeleton元件邏輯製作的動畫的骨架。

它也確保基於虛擬人偶皮膚顏色來應用手顏色(透過執行虛擬人偶附加元件提供的IAvatarRepresentationListener)。

這個指令碼存在兩個版本,一個是針對本機硬體手(針對碰撞器本機化的目的來用於製作手骨架的動畫,或如果我們需要離線手的情形),一個是針對網路手。

本機硬體裝備手

這個版本相依於位於硬體手上的OVRHands

在其他功能之外,它也確保在2個拿取碰撞器之間切換,一個在使用手指追蹤時位於手掌的位置,一個在使用控制器追蹤時位於手掌的位置(手的「中心」在這兩個模式中不完全在同一個位置)。

注意事項
在目前的設定中,已經選擇只顯示已連網手:硬體裝備中的手只用於收集骨位置,並且正確設定索引碰撞器位置的動畫。
因此,用於硬體手的材質是透明的(針對控制器手,在Android上需要它,否則如果停用轉譯器的話,動畫不會移動骨)。
因為HardwareOVRHandRepresentationManagerMaterialOverrideMode被設定為Override,並且在overrideMaterialForRenderers欄位中提供一個透明材質,硬體手網格自動設定為透明。

網路裝備手

NetworkOVRHandRepresentationManager元件處理基於手模式而顯示的網格:使用控制器追蹤時的Oculus範例框架手網格(它在RemoteOVRHand資料中檢查它),或相依於OVRHand邏輯的網格。

NetworkHand

相依性

  • 虛擬人偶附加元件2.0.2
  • Meta XR核心SDK

下載

這個附加元件的最新版本被包含在附加元件專案之中

已支援拓撲

  • 共享模式

更改記錄

  • 版本2.0.0:第一個版本
Back to top