前言
前段時間 Oculus 的 SDK 頻繁更新,很多已有的教程都不再適用於現在的版本了。本系列文章的主要目的是記錄現版本常見功能的實現方法,便於自己後續開發。當然,不排除我文章剛寫完 SDK 又變了的可能性,所以如果有人發現文章的內容已經不適用於新版本了,也可以留評論或者私信我,我會持續更新文章內容。
當前適用版本:
- Unity 版本:2021.3.7f1c1
- Oculus Interaction SDK 版本:47.0
文章最近更新日期:2023.02.20
環境準備
專案建立與新增 SDK 的具體方式不再描述,之前的文章中有提到過
【Oculus Interaction SDK】(一)設定 VR 相機與控制器 & 實現簡單的抓取功能 - 千葉Christa - 部落格園 (cnblogs.com)
建立一個新場景,刪除原相機,在 Project 視窗搜尋 OculusInteractionSampleRig
,並將其新增到場景中
製作所需的手勢
建立一個空物體 Poses 作為要製作的所有手勢的父級,在它之下再建立一個空物體 Bunny Right(右手的兔子手勢),用來記錄我們需要測試的手勢
為 Bunny Right 新增 Shape Recognizer Active State
和 Hand Ref
元件,並完成元件之間的引用
注:文章中用到的手是右手,如需使用左手,請引用 LeftHand
接下來,我們需要為手勢記錄器(Shape Recognizer Active State)新增手勢
在 Assets 資料夾下新建一個 Hand Pose 資料夾,用於存放手勢相關的資料檔案
右鍵 > Create > Oculus > Interaction > SDK > Pose Detection > Shape,建立一個手勢檔案 Bunny
我們可以透過這個檔案來建立想要的手勢(圖中設定為兔子手勢)
關於手勢設定的詳細資訊,可以參照這篇文章
【Oculus Interaction SDK】(十一)關於手勢識別中手勢設定的詳細資訊 - 千葉Christa - 部落格園 (cnblogs.com)
實現手勢識別功能
把設定好的手勢 Bunny 新增到 Shape Recognizer Active State 的手勢列表中
接著新增一個 Active State Selecter 元件,並引用 Shape Recognizer Active State 元件,這樣我們就可以檢測手的姿態了
現在,我們需要檢測手勢識別的效果
在場景中新建一個 Cube,設定好大小和位置,並新增 Selector Debug Visual 來視覺化手勢的檢測結果
測試下效果
從上面的測試結果來看,我們的手勢姿態已經可以被檢測到了。但是當我壓下手腕做出“剪刀”手勢的時候,檢測器依舊會把手勢識別為“兔子”。
“剪刀”與“兔子”手勢在手指設定上是相同的,但是對應的手掌與手腕的方向並不相同,能不能對這一點進行進一步的區分呢?
我們下一步就來解決這個問題!
設定手腕與手掌的方向限制
回到 Bunny Right,新增 Transform Recognizer Active State 元件
- 在 Hand 處引用 Hand Ref 獲取手的姿態
- 在 Transform Feature Configs 處選擇 Palm Away From Face(手掌遠離面部),並標記為 True
- 在 Up Vector Type 處選擇 World,使手勢的向上的方向與世界保持一致
- 在 Feature Thresholds 處開啟選擇器,選擇預設的特徵閾值檔案
Feature Threshold 檔案儲存了每個手指的閾值配置,你也可以建立一個新的閾值檔案要儲存自定義的設定(在這裡我直接使用了預設檔案)
回到 Punny Right,現在我們有兩個手勢識別器:Shape Recognizer Active State 和 Transform Recognizer Active State
但是在 Cube 的 Selector Debug Visual 元件上只能引用一個識別器
這個問題該如何解決呢?
為 Punny Right 新增 Active State Group 元件,將兩個識別器都新增到 Active States 列表中,並將 Logic Operator 改為 AND(同時滿足兩個條件)
在 Active State Selector 處引用 Active State Group,這樣就完成了!
大功告成!