共用方式為


Unreal 中的手勢追蹤

手部追蹤系統使用個人的手掌和手指作為輸入。 每個手指的位置和旋轉數據、整個手掌和手勢都可以使用。 從 Unreal 4.26 開始,手部追蹤是以 Unreal HeadMountedDisplay 外掛程式為基礎,並在所有 XR 平臺和裝置上使用通用 API。 Windows Mixed Reality 和 OpenXR 系統的功能都相同。

手部姿勢

手擺姿勢可讓您追蹤並使用使用者的手和手指做為輸入,這可在藍圖和 C++ 中存取。 Unreal API 會將數據當做座標系統傳送,且刻度會與 Unreal 引擎同步。

手部基本架構影像與關節重疊手部基本架構

列舉會 EHandKeypoint 描述階層:

手鍵點模糊選項的影像

您可以使用取得動作控制器數據函式,從使用者的手中 取得所有這些數據 。 該函式會傳 回 XRMotionControllerData 結構。 以下範例藍圖腳本會剖析 XRMotionControllerData 結構,以取得手部關節位置,並在每個關節的位置繪製偵錯座標系統。

依通道函式連線到線條追蹤的注視數據函式藍圖

請務必檢查結構是否有效,而且它是一手。 否則,您可能會在存取位置、旋轉和弧度陣列時取得未定義的行為。

手部姿勢會使用 Live Link 外掛程式公開給動畫。

如果已啟用 Windows Mixed Reality 和 Live Link 外掛程式:

  1. 選取 [視窗 > 實時連結 ] 以開啟 [即時鏈接編輯器] 視窗。
  2. 選取 [來源 ],然後啟用 Windows Mixed Reality Hand Tracking Source

實時連結來源

啟用來源並開啟動畫資產之後,請展開 [預覽場景] 索引卷標中的 [動畫] 區段,也會看到其他選項。

實時連結動畫

手部動畫階層與 中的 EWMRHandKeypoint相同。 動畫可以使用 WindowsMixedRealityHandTrackingLiveLinkRemapAsset 來複位目標

實時鏈接動畫 2

它也可以在編輯器中子類別化:

Live Link Remap

手部網格

重要

手部網格需要 OpenXR。

您必須使用 Microsoft OpenXR 外掛程式,才能從 Unreal MarketplaceGitHub 取得。

手網格做為追蹤幾何

重要

在 OpenXR 中以追蹤幾何的形式取得手網格,需要您呼叫 Set Use Hand Mesh with Enabled Tracking Geometry

若要啟用該模式,您應該呼叫 Set Use Hand Mesh with Enabled Tracking Geometry

事件藍圖開始播放連線以設定使用手網格函式與啟用的追蹤幾何模式

注意

無法同時啟用這兩種模式。 如果您啟用其中一個,則會自動停用另一個。

存取 Hand Mesh 數據

手部網格

您必須先:才能存取手部網格資料:

  • 選取您的ARSessionConfig資產、展開AR設定 -> 世界對應設定,然後核取 [從追蹤幾何產生網格數據]。

以下是預設網格參數:

  1. 使用網格數據進行遮蔽
  2. 產生網格數據的衝突
  3. 產生網格數據的導覽網格
  4. 在Wireframe中轉譯網格資料 - 顯示產生的網格的偵錯參數

這些參數值會當做空間對應網格和手部網格預設值使用。 您可以隨時在藍圖或任何網格的程式代碼中變更它們。

C++ API 參考

用來 EEARObjectClassification 尋找所有可追蹤物件的手網格值。

enum class EARObjectClassification : uint8
{
    // Other types
	HandMesh,
};

當系統偵測到任何可追蹤的物件時,會呼叫下列委派,包括手部網格。

class FARSupportInterface
{
    public:
    // Other params
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};

請確定您的委派處理程式遵循下列函式簽章:

void UARHandMeshComponent::OnTrackableAdded(UARTrackedGeometry* Added)

您可以透過 UARTrackedGeometry::GetUnderlyingMesh存取網格資料:

UMRMeshComponent* UARTrackedGeometry::GetUnderlyingMesh()

藍圖 API 參考

若要在藍圖中使用手部網格:

  1. ARTrackableNotify 元件新增至藍圖動作專案

ARTrackable Notify

  1. 移至 [ 詳細數據] 面板,然後展開 [ 事件 ] 區段。

ARTrackable Notify 2

  1. 在事件圖形中使用下列節點覆寫 Add/Update/Remove Tracked Geometry:

在ARTrackable Notify

OpenXR 中的 Hand Mesh 視覺效果

可視化手部網格的建議方式是搭配 Microsoft OpenXR 外掛程式使用 Epic 的 XRVisualization 外掛程式

然後在藍圖編輯器中,您應該使用 Microsoft OpenXR 外掛程式中的設定 Use Hand Mesh 函式,並將 Enabled XRVisualization 作為參數:

事件藍圖開始播放連線以設定使用手網格函式與已啟用 xrvisualization 模式

若要管理轉譯程式,您應該使用 XRVisualization 中的轉譯動作控制器

取得連線到轉譯動作控制器函式之動作控制器數據函式的藍圖

結果:

數位手在真實人手上重疊的影像

如果您需要更複雜的專案,例如使用自定義著色器繪製手部網格,您需要取得網格做為追蹤幾何。

手部光線

取得手部姿勢適用於近距離互動,例如抓取物件或按下按鈕。 不過,有時候您需要使用遠離使用者的全像投影。 這可以透過手部光線來完成,這可用於 C++ 和藍圖中的指點裝置。 您可以從手部繪製光線到遠點,並從 Unreal 光線追蹤中取得一些協助,選取本來無法觸達的全像投影。

重要

由於所有函式結果都會變更每個畫面,因此它們全都是可呼叫的。 如需純函式和不完善或可呼叫函式的詳細資訊,請參閱函式上的藍圖使用者 GUID。

若要取得手部光線的數據,您應該使用上一節的取得動作控制器數據函式。 傳回的結構包含兩個參數,可用來建立手部光線 – 目標位置和目標旋轉。 這些參數會形成由肘部導向的光線。 您應該採用它們,並尋找所指向的全像投影。

以下是判斷手部光線是否擊中 Widget 並設定自定義命中結果的範例:

取得動作控制器數據函式的藍圖

手勢

HoloLens 2 會追蹤空間手勢,這表示您可以將這些手勢擷取為輸入。 手勢追蹤是以訂用帳戶模型為基礎。 您應該使用 「設定手勢」函式,告訴裝置您想要追蹤的手勢。您可以在 HoloLens 2 基本使用方式檔中找到有關手勢的更多詳細數據。

Windows Mixed Reality

事件藍圖開始播放連線以設定手勢函式

然後,您應該新增程式代碼以訂閱下列事件:

Windows 空間輸入保留、點選和左側操作手勢的藍圖詳細數據面板中 Windows 空間輸入點選手勢選項的螢幕快照

OpenXR

在OpenXR中,手勢事件會透過輸入管線追蹤。 使用手部互動,裝置可以自動辨識點選和按住手勢,但無法辨識其他手勢。 它們的名稱為 OpenXRMsftHandInteraction Select 和 Grip 對應。 您不需要啟用訂用帳戶,您應該在 Project 設定/Engine/Input 中宣告事件,如下所示:

OpenXR 動作對應的螢幕快照

下一個開發檢查點

依循我們配置的 Unreal 開發旅程,此時您會探索 MRTK核心建置組塊。 接下來,您可以繼續進行下一個建置組塊:

或者,直接跳到混合實境平台功能和 API 的主題:

您可以隨時回到 Unreal 開發檢查點