Meta OVR hands synchronization
這個附加元件展示了同步Meta的OVR手的手狀態的方法(包含手指追蹤)。
它可以從兩者之一顯示手:
- 從已拿取的控制器接收的資料
- 從手指追蹤資料。
關於手指追蹤資料,附加元件展示了如何高度壓縮手骨資料,以減少頻寬耗用。
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
預製件中,提供了附加元件中實際使用的預製件,以及新增到前一個附加元件的同步元件。
然後,使用了用於VR共享範例的收集和同步頭戴式裝置及手位置的相同的元件(請參見VR共享頁面中的HardwareRig
及HardwareHand
)。
最後,新增一些特定元件以處理手追蹤,及切換手追蹤及控制器追蹤手代表,如同下述。
手邏輯概述
這個附加元件讓基於控制器的手追蹤及基於手指的手追蹤共存。目標是在彼此之間有一個平順的轉換。
為了做到這點:
- 如同在其他VR範例中,當使用控制器時,顯示的手模型是來自Oculus範例框架。
- 當使用手指追蹤時,針對本機玩家,Meta XR核心SDK的
OVRHand
元件收集手及手指骨資料,OVRSkeleton
準備手指骨遊戲物件,而OVRMesh
及OVRMeshRenderer
以這些骨來準備附有皮膚的網格轉譯器。所有這些都可以從建議的組建方塊設定中獲得。或者您可以在Meta的設定手追蹤文檔頁面找到詳細說明 - 針對遠端使用者,一個
RemoteOVRHand
(詳見下述)從網路中復原與OVRSkeleton
、OVRMesh
及OVRMeshRenderer
期望相同的手及手指骨資料,以相同的方式重新組建手 - 這些手狀態中的其中幾個在接收時儲存在環緩衝之中。在每個
Render
期間,我們在過去的2個狀態之間以恆定的延遲來進行內插補點,以顯示平順的骨旋轉,甚至在2個刷新之間也是如此。
注意事項:
OVRSkeleton
、OVRMesh
及OVRMeshRenderer
類別對於遠端使用者,目前不能完美地用於編輯器之中,這是因為特定的偵錯問題,將在此說明。
為了繞過它,專案使用了它們的複本RemoteOVRSkeleton
、RemoteOVRMesh
及RemoteOVRMeshRenderer
,其簡單地移除了有問題的只能用於編輯器的命令列。
如果一個Meta套件更新讓它們與新的程式碼基礎無法相容,您可以透過它們的原始副本來安全地替換它們。
本機硬體裝備手元件
HardwareOVRHandCollecter
元件位於本機使用者硬體裝備的手上,其收集手狀態來提供它到同步元件。
它相依於Meta的OVRHand
元件,以存取手狀態(特別是包含手指骨旋轉)。
它也包含協助工具屬性以存取捏狀態,或了解目前是否使用手指追蹤。
網路裝備手元件
在本機使用者網路裝備上的RemoteOVRHand
相依於HardwareOVRHandCollecter
,以找到本機手狀態,並且隨後在FixedUpdateNetwork
期間儲存它在網路變數之中。
針對遠端使用者,這些資料被剖析以重新建立一個本機手狀態,其隨後用於回答RemoteOVRSkeleton
、RemoteOVRMesh
及RemoteOVRMeshRenderer
元件,這些處理實際骨轉換及手網格狀態。
已同步手狀態特別包含IsDataValid
,如果使用者使用手指追蹤則為真,其他情況則為偽,以及包含骨資訊。
頻寬最佳化
骨資訊的傳輸非常耗用頻寬:手狀態包含24個四元數以進行同步。這個同步的一個簡單方法,就是傳輸所有四元數,並沒有嘗試減少頻寬耗用,但是是有效的,並且可以用RemoteOVRHand
的UncrompressedRemoteOVRHand
替代版本測試它。
實際的RemoteOVRHand
執行方式使用手骨的一些屬性(特定的旋轉軸、有限的移動範圍等等)以減少所需頻寬。針對各個骨所需的精確度水平可以在一個專用的HandSynchronizationScriptable
可指令碼中指定(其必須提供到HardwareOVRHandCollecter
及RemoteOVRHand
)。
附加元件包含一個預設的HandSynchronizationConfigForCompressedMetaOVRHands
,其已經被組建以匹配大多數需求:
- 它提供一個非常高的壓縮,使用少20倍的位元組(對於一個完整四元數傳輸,一隻手全骨旋轉設定只儲存在18位元組而非386位元組)。可以透過
HandSynchronizationConfigForMetaOVRHands
可指令碼來測試一個完整四元數傳輸。 - 壓縮對遠端使用者的手指的代表沒有任何可見的影響。
內插補點
在RemoteOVRHands
上,在ParseNetworkData()
中偵測網路資料的更改的各個Render
期間,網路資料值被轉換成一個已壓縮手狀態,然後隨後轉換成一個實際手狀態,其可用於手骨架的動畫。
這個手狀態隨後儲存在一個限時的環緩衝之中(一個手狀態的環緩衝,其中我們也儲存插入時間)。
然後在各個轉譯期間,在InterpolateBonesRotations
中計算實際用於骨動畫的手狀態。它在過去的指定延遲左右的時間的環緩衝中儲存的2個手狀態之間進行內插補點。
這樣的話,就算在刷新接收之間,手骨都可以在已接收旋轉值之間平順地旋轉。
切換手模型
OVRHandRepresentationManager
元件處理針對手顯示的網格,這是基於目前使用的手追蹤模式:
- 使用控制器追蹤時的Oculus範例框架手網格,
- 或使用手指追蹤時,網格相依於由
OVRSkeleton
元件邏輯製作的動畫的骨架。
它也確保基於虛擬人偶皮膚顏色來應用手顏色(透過執行虛擬人偶附加元件提供的IAvatarRepresentationListener
)。
這個指令碼存在兩個版本,一個是針對本機硬體手(針對碰撞器本機化的目的來用於製作手骨架的動畫,或如果我們需要離線手的情形),一個是針對網路手。
本機硬體裝備手
這個版本相依於位於硬體手上的OVRHands
。
在其他功能之外,它也確保在2個拿取碰撞器之間切換,一個在使用手指追蹤時位於手掌的位置,一個在使用控制器追蹤時位於手掌的位置(手的「中心」在這兩個模式中不完全在同一個位置)。
注意事項:
在目前的設定中,已經選擇只顯示已連網手:硬體裝備中的手只用於收集骨位置,並且正確設定索引碰撞器位置的動畫。
因此,用於硬體手的材質是透明的(針對控制器手,在Android上需要它,否則如果停用轉譯器的話,動畫不會移動骨)。
因為HardwareOVRHandRepresentationManager
的MaterialOverrideMode
被設定為Override
,並且在overrideMaterialForRenderers
欄位中提供一個透明材質,硬體手網格自動設定為透明。
網路裝備手
NetworkOVRHandRepresentationManager
元件處理基於手模式而顯示的網格:使用控制器追蹤時的Oculus範例框架手網格(它在RemoteOVRHand
資料中檢查它),或相依於OVRHand
邏輯的網格。
相依性
- 虛擬人偶附加元件2.0.2
- Meta XR核心SDK
下載
這個附加元件的最新版本被包含在附加元件專案之中
已支援拓撲
- 共享模式
更改記錄
- 版本2.0.0:第一個版本