此教程相關(guān)的詳細(xì)教案,文檔,思維導(dǎo)圖和工程文件會放入 Spatial XR 社區(qū)。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔(dān)任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進(jìn)階教程、外包、行業(yè)動態(tài)等服務(wù)。
社區(qū)鏈接:
Spatial XR 高級社區(qū)(知識星球)
Spatial XR 高級社區(qū)(愛發(fā)電)
??教程說明
這篇教程將會介紹 Meta XR SDK(舊版叫做 Oculus Integration)中處理手部數(shù)據(jù)的基本流程和交互的流程,并且配置一個基本的玩家物體,在虛擬場景中能夠看到擁有手勢追蹤的手部模型。(下文中提到的 Oculus Integration 同樣使用于 Meta XR SDK)
系列教程專欄:https://blog.csdn.net/qq_46044366/category_12118293.html
配套的視頻鏈接:【2023 VR+MR全硬件開發(fā)教程】三(上)、Quest Integration基本原理概念與結(jié)構(gòu)(上)-知識點講解(主講:YY)
【2023 VR+MR全硬件開發(fā)教程】 三 (下): 手勢追蹤與玩家角色配置(主講:YY)
環(huán)境配置可參考:https://blog.csdn.net/qq_46044366/article/details/133967343
?電腦操作系統(tǒng):Windows 11
使用的 VR 設(shè)備:Meta Quest 3(Quest 系列都適用)
使用的 Unity 版本:2021.3.5 LTS (這里推薦使用 2021 及以上的 LTS 版本)
Oculus Integration 版本:v57
官方文檔:https://developer.oculus.com/documentation/unity/unity-gs-overview/
https://developer.oculus.com/documentation/unity/unity-isdk-architectural-overview/
??輸入數(shù)據(jù)
VR 中的雙手要么就是用手柄控制,要么就是用手勢追蹤控制。當(dāng)我們使用手柄作為輸入的時候,虛擬世界中的手部會同步現(xiàn)實世界中手柄的位置和旋轉(zhuǎn),使用手勢追蹤作為輸入的時候,虛擬世界中的手部會同步現(xiàn)實世界中手的姿態(tài)。然后 VR 中的頭部由頭顯控制,也就是說我們的視角可以根據(jù)現(xiàn)實中頭顯的位置和旋轉(zhuǎn)發(fā)生變化。因此,現(xiàn)實世界中頭顯和手柄的追蹤數(shù)據(jù)會被傳輸給虛擬世界中的頭部和手部,然后虛擬世界中的頭和手就會同步現(xiàn)實中的位置和旋轉(zhuǎn)。同樣,這個概念適用于所有的 VR SDK。
那么 Oculus Integration 中用了一系列 From OVR…Source 組件來獲取追蹤的數(shù)據(jù)。在 Oculus Integration V57 版本中具體分為這 5 個組件:
From OVR Body Data Source:獲取上半身身體運動姿態(tài)數(shù)據(jù)。
From OVR Controller Data Source:獲取手柄姿態(tài)數(shù)據(jù),在虛擬世界中以手柄模型來表示。
From OVR Controller Hand Data Source:獲取手柄姿態(tài)數(shù)據(jù),在虛擬世界中以手部模型來表示。
From OVR Hand Data Source:獲取手勢追蹤的手部姿態(tài)數(shù)據(jù)。
From OVR Hmd Data Source:獲取頭顯的姿態(tài)數(shù)據(jù)。
獲取了追蹤數(shù)據(jù)之后,Oculus Integration 會用相應(yīng)的接口去處理對應(yīng)類型的數(shù)據(jù),這些接口分為 IController, IHand, IHmd, and IBody,對追蹤數(shù)據(jù)進(jìn)行處理和包裝之后,才能適配 SDK 中的一些組件。這樣,這些組件就能夠利用獲取的數(shù)據(jù)去實現(xiàn)相應(yīng)的交互功能。
??Oculus Integration 處理手部數(shù)據(jù)的推薦流程
首先通過 FromOVRHandDataSource 獲取頭顯追蹤到的手部數(shù)據(jù)。
然后數(shù)據(jù)會被傳給 HandFilter 組件,這個組件就實現(xiàn)了 IHand 接口,它能夠進(jìn)行一些防抖的處理。
接下來 SynthethicHand 組件會對手部關(guān)節(jié)的數(shù)據(jù)進(jìn)行進(jìn)一步的處理,它會在特定情況下覆寫,也就是 override 手部關(guān)節(jié)的數(shù)據(jù),從而限定虛擬手部的手勢。比如我在 VR 中用手按壓一個按鈕,當(dāng)我按到底的時候,按常理來說我的手是不能再往下按了,否則就會穿過按鈕,產(chǎn)生穿?,F(xiàn)象。但是因為我在現(xiàn)實世界中可能沒有在按一個真的按鈕,所以現(xiàn)實中的手是可以繼續(xù)往下按的,而 VR 中的手需要同步現(xiàn)實世界里手部的位置,那么這種情況下 VR 中的手就必定會穿過按鈕。而 SynthethicHand 組件就能夠限制虛擬手部的位置,當(dāng)按鈕按到底的時候,這個組件就能限制 VR 中的手無法繼續(xù)向下移動。還有 VR 中的抓取也是類似的原理,當(dāng)你用手抓到這個物體的時候,會呈現(xiàn)出一個抓取的手勢,而 SynthethicHand 組件能夠限定住抓取手勢的姿態(tài)。
當(dāng) SynthethicHand 對手部數(shù)據(jù)進(jìn)行處理之后,就會由 HandVisual 組件來渲染虛擬手部的姿態(tài)。
??VR 中交互的基本概念
VR 中的交互需要有兩個對象參與。一個是 Interactor,一個是 Interactable。Interactor 是發(fā)起交互的對象,Interactable 是可以被交互的對象。以抓取交互為例,抓取的流程就是用手去抓一個物體的過程,那么手就是發(fā)起抓取的對象,也就是 Interactor,物體就是可以被抓取的對象,也就是 Interactable。這個 Interactor 和Interactable 的概念會在我們后續(xù)的教程中經(jīng)常用到,這個概念在其他的 VR SDK 中也會見到。
??Oculus Integration 中的交互流程
Oculus Integration 中有不同的 Interactor 組件,它們通常被掛載到表示手部或者手柄的物體上。當(dāng) Oculus Integration 獲取了設(shè)備的追蹤數(shù)據(jù)后,它就知道虛擬世界中的手或者手柄的位置和旋轉(zhuǎn)角度應(yīng)該是什么樣的,這個時候手部或者手柄物體上的 Interactor 就會尋找對應(yīng)的 Interactable。比如抓取相關(guān)的 Interactor 會尋找周圍有沒有可以被抓取的對象,點觸(Poke)相關(guān)的 Interactor 會尋找周圍有沒有可以被點擊的對象,如下圖所示:
當(dāng) Interactor 檢測到 Interactable 對象時,會進(jìn)入到 Hover 狀態(tài)。不過判斷是否檢測到需要一些條件,以手勢追蹤為例,需要滿足下面這幾個條件:
- 手要靠近 Interactable 對象
- 確保當(dāng)前手上沒有其他的 Interactor 正在與對應(yīng)的 Interactable 對象交互
- 手要做出 Interactor 觸發(fā)需要的手勢。比如用手點擊 UI 按鈕的交互,需要伸出食指,如果伸出的是小拇指,就無法觸發(fā)。
滿足條件后,就會進(jìn)入 Hover 狀態(tài),相當(dāng)于準(zhǔn)備開始交互的階段。Hover 可以類比成鼠標(biāo)懸停的操作。
進(jìn)入 Hover 狀態(tài)后,完成交互動作就能進(jìn)入 Select 狀態(tài)。比如還是點擊 UI 按鈕的交互,當(dāng)我伸出食指并且靠近按鈕時,會進(jìn)入 Hover 狀態(tài),用食指戳到按鈕的時候就會轉(zhuǎn)變?yōu)?Select 狀態(tài),表示點擊的交互動作完成。然后當(dāng)我取消點擊動作之后,也就是將手遠(yuǎn)離按鈕的這一過程中,交互狀態(tài)就會先由 Select 變?yōu)?Hover,再由 Hover 變?yōu)?Normal。那么我這里給出 Meta 官方提供的 Interactor-Interactable 交互狀態(tài)切換圖(https://developer.oculus.com/documentation/unity/unity-isdk-interactor-interactable-lifecycle/):
Disabled 就是無法發(fā)生交互的狀態(tài)。然后默認(rèn)狀態(tài)是 Normal,當(dāng)交互功能被開啟的時候,就會在 Normal,Hover,Select 這三個狀態(tài)之間互相切換。
??配置一個基本的玩家物體
現(xiàn)在,我們已經(jīng)對 Oculus Integration 中的處理手部數(shù)據(jù)的流程和交互的基本概念有了初步的認(rèn)識。接下來,我們在 Unity 中配置一個玩家物體,之后在介紹各種交互功能的時候就可以在這個玩家物體上不斷添加功能。
前置的環(huán)境配置可以參考這篇教程:Unity Meta Quest 一體機(jī)開發(fā):前期準(zhǔn)備和環(huán)境配置(2023 版,Oculus Integration v57)
首先新建一個場景,刪去場景中的 Main Camera,然后添加一個 Plane 物體作為地面。
?OVRCameraRig
然后在如下文件夾中找到 OVRCameraRig 預(yù)制體,或者在 Project 窗口中搜索這個物體:
將該物體拖到場景中,找到它身上的 OVR Manager 腳本,將 Tracking Origin Type 改為 Floor Level:
選擇 Floor Level,會以安全區(qū)的地面(打開 VR 設(shè)備一般都會先設(shè)置地面高度,然后劃安全區(qū))作為參考系,運行程序后頭部高度會以地面作為參考點,初始高度相當(dāng)于擺放在場景中的眼部相機(jī)的高度加上現(xiàn)實中玩家頭顯到安全區(qū)地面的距離。Tracking Origin Type 的區(qū)別可以參考這篇文章:https://blog.csdn.net/qq_46044366/article/details/131616046
?OVRInteraction
搜索 OVRInteraction 預(yù)制體,將它拖入 Hierarchy 面板,作為 OVRCameraRig 的子物體。這個 OVRInteraction 物體就是負(fù)責(zé)所有交互功能的父物體。
OVRInteraction 下自帶一個 OVRHmd 物體,用于獲取頭顯追蹤姿態(tài)的數(shù)據(jù)。
?OVRHandPrefab
搜索 OVRHandPrefab 預(yù)制體,先將它拖到 OVRCameraRig > TrackingSpace > LeftHandAnchor 下:
打開 OVRHandPrefab 的 Inspector 面板,除了 OVR Hand 和 OVR Skeleton 腳本,其他的腳本先取消勾選:
然后在 OVR Skeleton 腳本里, 勾選 Enable Physics Capsules:
然后將這個 OVRHandPrefab 復(fù)制一份,作為 RightHandAnchor 的子物體:
將右手 OVRHandPrefab 的 OVRHand 和 OVRSkeleton 腳本的 Hand Type 從 Hand Left 改為 Hand Right:
?OVRHands
搜索 OVRHands 預(yù)制體,將它作為 OVRInteraction 的子物體:
我們可以展開這個預(yù)制體:
點擊 OVRHandDataSource 物體,它上面掛載了 FromOVRHandDataSource 腳本,用于獲取手部的姿態(tài)數(shù)據(jù):
點擊 HandDataLeft,它上面掛載了一些實現(xiàn) IHand 接口的腳本,用于處理獲取到的手部追蹤數(shù)據(jù),其中 Hand Filter 就是剛剛介紹的用于防抖處理的腳本:
展開 HandVisualsLeft,它有個 OVRLeftHandVisual 子物體,上面有一個 Hand Visual 組件,用于渲染手部模型:
但是默認(rèn)的 OVRHands 預(yù)制體下沒有掛載了 SynthethicHand 腳本的物體,我們可以手動添加。
?OVRLeftHandSynthetic/OVRRightHandSynthetic
搜索 OVRLeftHandSynthetic 和 OVRRightHandSynthetic 預(yù)制體,將它們作為 OVRHands 的子物體:
找到 OVRLeftHandSynthetic 物體上的 SyntheticHand腳本,將 LeftHand 物體拖入 I Modify Data From Source Mono 變量,右手同理:
然后我們展開這兩個預(yù)制體,它們下面各有一個 HandVisual 子物體,用于渲染手部模型。
但是 OVRHands 物體的 LeftHand 和 RightHand 下也有用于渲染手部模型的物體,這時候如果我們運行程序,會發(fā)現(xiàn)手部模型閃爍。這是因為場景中會渲染兩雙手,手部模型重合在一起就會發(fā)生閃爍。
因此,我們需要把 LeftHand 和 RightHand 下的 HandVisualsLeft 和 HandVisualsRight 物體隱藏掉,保證渲染的是 SyntheticHand。
文章來源:http://www.zghlxwxcb.cn/news/detail-792083.html
現(xiàn)在運行程序,如果你能看到手勢追蹤的雙手,就說明玩家物體配置成功了。不過 SyntheticHand 的效果要結(jié)合具體的交互組件來看,我會在后續(xù)的教程中詳細(xì)說明。文章來源地址http://www.zghlxwxcb.cn/news/detail-792083.html
到了這里,關(guān)于Unity Meta Quest 一體機(jī)開發(fā)(三):【手勢追蹤】Oculus Integration/Meta XR SDK 基本原理、概念與結(jié)構(gòu)+玩家角色基本配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!