【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

千葉Christa發表於2023-02-20

前言

前段時間 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,並將其新增到場景中

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

製作所需的手勢

建立一個空物體 Poses 作為要製作的所有手勢的父級,在它之下再建立一個空物體 Bunny Right(右手的兔子手勢),用來記錄我們需要測試的手勢

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

為 Bunny Right 新增 Shape Recognizer Active StateHand Ref 元件,並完成元件之間的引用

注:文章中用到的手是右手,如需使用左手,請引用 LeftHand

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

接下來,我們需要為手勢記錄器(Shape Recognizer Active State)新增手勢

 

在 Assets 資料夾下新建一個 Hand Pose 資料夾,用於存放手勢相關的資料檔案

右鍵 > Create > Oculus > Interaction > SDK > Pose Detection > Shape,建立一個手勢檔案 Bunny

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

我們可以透過這個檔案來建立想要的手勢(圖中設定為兔子手勢)

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

關於手勢設定的詳細資訊,可以參照這篇文章

【Oculus Interaction SDK】(十一)關於手勢識別中手勢設定的詳細資訊 - 千葉Christa - 部落格園 (cnblogs.com)

 

實現手勢識別功能

把設定好的手勢 Bunny 新增到 Shape Recognizer Active State 的手勢列表中

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

接著新增一個 Active State Selecter 元件,並引用 Shape Recognizer Active State 元件,這樣我們就可以檢測手的姿態了

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

現在,我們需要檢測手勢識別的效果

 

在場景中新建一個 Cube,設定好大小和位置,並新增 Selector Debug Visual 來視覺化手勢的檢測結果

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

測試下效果

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

從上面的測試結果來看,我們的手勢姿態已經可以被檢測到了。但是當我壓下手腕做出“剪刀”手勢的時候,檢測器依舊會把手勢識別為“兔子”。

“剪刀”與“兔子”手勢在手指設定上是相同的,但是對應的手掌與手腕的方向並不相同,能不能對這一點進行進一步的區分呢?

我們下一步就來解決這個問題!

 

設定手腕與手掌的方向限制

回到 Bunny Right,新增 Transform Recognizer Active State 元件

  • 在 Hand 處引用 Hand Ref 獲取手的姿態
  • 在 Transform Feature Configs 處選擇 Palm Away From Face(手掌遠離面部),並標記為 True
  • 在 Up Vector Type 處選擇 World,使手勢的向上的方向與世界保持一致
  • 在 Feature Thresholds 處開啟選擇器,選擇預設的特徵閾值檔案

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別  【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

Feature Threshold 檔案儲存了每個手指的閾值配置,你也可以建立一個新的閾值檔案要儲存自定義的設定(在這裡我直接使用了預設檔案)

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

回到 Punny Right,現在我們有兩個手勢識別器:Shape Recognizer Active State 和 Transform Recognizer Active State

但是在 Cube 的 Selector Debug Visual 元件上只能引用一個識別器

這個問題該如何解決呢?

 

為 Punny Right 新增 Active State Group 元件,將兩個識別器都新增到 Active States 列表中,並將 Logic Operator 改為 AND(同時滿足兩個條件)

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

在 Active State Selector 處引用 Active State Group,這樣就完成了!

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 

大功告成!

【Oculus Interaction SDK】(十)在 VR 中使用手勢識別

 


參考資料

Hand Pose Detection with Oculus Interaction SDK - YouTube

相關文章