交互組件

控制器藍圖

不同控制器的(de)實現通(tōng)過組件完成,便于在演員(yuán)中進行擴展或替換。

 

父組件類 BP_ControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)負責訪問注視控制器和(hé)指針控制器。該藍圖爲管理(lǐ)交互提供了(le)基礎,并包含一些可(kě)以在所有派生控制器中由開發者自定義的(de)選項。

 

● 自動激活(Auto Activate):指示控制器是否默認啓用(yòng)。

 延遲啓動(Delay Start):應用(yòng)程序啓動或加載新地圖時(shí),交互啓用(yòng)前的(de)等待時(shí)間。

● 标簽組件(Tag Component):父組件(來(lái)自 pawn 角色)上的(de)标簽名稱,以便後續在控制器組件實現中進行引用(yòng)。

 

以下(xià)是與控制器組件交互或創建自定義子控制器組件時(shí)需要注意的(de)一些函數:

 

● Start:此事件應僅在首次初始化(huà)控制器時(shí)調用(yòng),不支持重寫。最好從 Begin Play 節點調用(yòng)。

● Start_Implementation:此函數負責每個(gè)子組件的(de)具體初始化(huà)。

● Set Default Controller:配置組件在初始化(huà)後是否應被激活。因此,這(zhè)個(gè)函數僅在 Start 函數之前調用(yòng)時(shí)才有意義。

● Enable:啓用(yòng)組件。

● Disable:禁用(yòng)組件。

● Is Enable:返回組件是否已啓用(yòng)。

● Press/Release Button:使用(yòng) Widget Interaction Component 管理(lǐ)按鈕交互。

● Is Over Interactable Widget:返回 Widget Interaction Component 是否指向一個(gè)可(kě)交互的(de) Widget。




提示!

在 XR 項目的(de)控制器中,關鍵組件是 Widget Interaction Component。所有組件或派生組件應該僅根據控制器的(de)類型來(lái)建立交互規則。有關該組件的(de)基本信息,請參考 Unreal 文檔


注視控制器


注視控制器 BP_GazeControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)負責管理(lǐ)射線投射和(hé)與場(chǎng)景中 Widget 的(de)交互,以及延遲交互功能和(hé)指針的(de)“點擊”功能。


注視指針限制

目前,注視指針隻能與場(chǎng)景中的(de) Widget 進行交互,無法與 3D 演員(yuán)進行交互,這(zhè)與 Pointer Controller 不同,後者可(kě)以與 Widget 和(hé) 3D 演員(yuán)都進行交互。

 

開發者可(kě)以自定義的(de)選項包括:

● Move Reticle to Hit:啓用(yòng)此選項後,當用(yòng)戶注視一個(gè)交互對(duì)象時(shí),瞄準點會移動到該對(duì)象的(de)交互位置。

● Timer Duration:用(yòng)戶需要注視某個(gè)對(duì)象多(duō)長(cháng)時(shí)間才能選擇它。

● Default Distance:當啓用(yòng) bMoveReticleToHit 時(shí),設置注視控制器的(de)距離。

● Vertical Bias:瞄準點的(de)垂直位置,0 表示屏幕中心,1 表示屏幕頂部,-1 表示屏幕底部。

● Reticle Outer Ring:外環瞄準點的(de)材質,如果設置爲 NULL,則表示外環被禁用(yòng)。此功能在 SDK 版本 0.15.0 中已棄用(yòng)。

 

圖片11.png

 

最後,樣本中用(yòng)于指向世界的(de)瞄準點由一個(gè)隐藏的(de) Widget Component 和(hé)一個(gè) Stereo Layer 組件組成。所有與注視相關的(de)組件都會使用(yòng)組件标簽(gaze)進行區(qū)分(fēn),控制器組件假設注視的(de) Widget Interaction Component 始終是其他(tā)必要組件的(de)父組件。

 

● Stereo Layer:爲了(le)避免指針出現抖動,建議(yì)在立體層中渲染紋理(lǐ),要使其正常工作,需要啓用(yòng) Live Texture,并将 Stereo Layer Shape 設置爲 Quad Layer。請注意,與其他(tā)組件不同,Unreal會将此組件的(de)變換值解釋爲相對(duì)于相機,而不是相對(duì)于父組件或附加的(de) Actor。函數 Update Reticle Position(在組件藍圖中)将 Widget 移動到交互擊中位置,并計算(suàn)相對(duì)于相機的(de)位置以用(yòng)于立體層。然而,大(dà)小必須使用(yòng) Quad Size 變量來(lái)定義,而不是使用(yòng)縮放。此外,由于控制器組件會将 Widget Component 的(de)渲染複制到立體層中,因此紋理(lǐ)不需要初始化(huà)。

 

圖片12.png


● Widget Component:此組件被隐藏,因爲立體層負責渲染瞄準點。可(kě)以在 WBP_GazePointer 資産中修改原始紋理(lǐ)(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > UI)。它使用(yòng)靜态材質(MI_Reticle_Inner)來(lái)渲染内環,而外環則使用(yòng)動态材質(MI_Reticle_Outer),這(zhè)個(gè)動态材質定義了(le)一個(gè)參數(Percentage),用(yòng)于實現瞄準點交互的(de)視覺效果。

 

指針控制器

指針控制器的(de)主要功能在 BP_PointerControllerComponent 中實現(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)。它的(de)工作原理(lǐ)與其他(tā)控制器類似,但初始化(huà)過程會根據設備是否支持 3DoF 或 6DoF 進行調整。使用(yòng)微軟交互配置文件的(de)控制器會自動作爲 3DoF 控制器啓用(yòng),而使用(yòng) Oculus 交互配置文件的(de)控制器會自動作爲 6DoF 控制器啓用(yòng),這(zhè)些設置都在 Motion Controller Component 中完成。

 

圖片13.png


請注意,當使用(yòng) 3DoF 控制器時(shí),必須選擇左手。對(duì)于 6DoF 控制器,選擇的(de)手可(kě)以是左手或右手,這(zhè)取決于控制器設計的(de)手型。此外,開發者還(hái)可(kě)以選擇哪個(gè)控制器處理(lǐ)交互。

 

Spawn Controller 函數會生成一個(gè) BP_PointerController 類的(de)子 Actor,該子 Actor 是通(tōng)過 Motion Controller Class 變量設置的(de)。

 

BP_PointerController Actor(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable)已準備好管理(lǐ)每個(gè)獨立的(de)控制器。

 

Motion Controller Component 作爲根組件的(de)子組件添加,用(yòng)于管理(lǐ)每個(gè)控制器。該組件的(de) Visualization 部分(fēn)允許在虛拟世界中渲染一個(gè) 3D 模型,以跟随現實世界中控制器的(de)移動,隻需啓用(yòng) Display Device Model 選項,如果開發者希望根據配置文件顯示每個(gè)設備的(de)默認網格,可(kě)以在 Display Model Source 選項中選擇 OpenXR。否則,開發者可(kě)以選擇 Custom 來(lái)進行自定義,并在 Custom Display Mesh 中添加網格。最後,在 Motion Controller 部分(fēn),開發者應設置輸入類型。

 

圖片14.png

 

隻有在啓用(yòng)交互的(de)情況下(xià),Motion Controller Component 必須附加以下(xià)組件:Widget Interaction Component,用(yòng)于準确跟蹤控制器在現實世界中的(de)移動,以及一個(gè) Static Mesh Component(在示例中稱爲 Laser Pointer Mesh),用(yòng)于可(kě)視化(huà)指針。不論是否啓用(yòng)交互,如果使用(yòng)的(de)是 6DoF 設備,則父組件需要附加一個(gè) Child Actor Component,使用(yòng) BP_XRControllerRepresentation(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Placeable),以顯示控制器及其動畫(huà)。

 

手部追蹤控制器

手部追蹤控制器 BP_HandTrackingControllerComponent(位于 SnapdragonSpacesSamples Content > SnapdragonSpaces > Common > Core > Components)負責生成和(hé)啓用(yòng)使用(yòng)手部追蹤進行遠(yuǎn)程交互所需的(de) Actor。這(zhè)些 Actor 将自動處理(lǐ)交互。該控制器僅在項目設置中的(de)手部追蹤功能(位于 Project Settings > Snapdragon Spaces plugin)被啓用(yòng)時(shí)才會激活。此控制器支持與場(chǎng)景中的(de) Widget Actor 以及可(kě)以通(tōng)過手部追蹤進行交互的(de) Actor 進行交互。有關手部追蹤交互的(de)詳細信息,請參考手部追蹤示例


圖片15.png

 

輸入快(kuài)捷方式

用(yòng)于輸入操作的(de)按鈕:


主機控制器

右側 XR 控制器

左側 XR 控制器

選擇

觸摸闆點擊

右側觸發按鈕

左側觸發按鈕

凝視/指針切換

菜單按鈕

左側菜單按鈕

觸摸闆

觸摸闆

左側搖杆

錨點位置确認

觸摸闆點擊

任何觸發按鈕

任何觸發按鈕


圖片16.png


UI用(yòng)戶界面

世界中的(de) 3D 小部件必須使用(yòng)藍圖 BP_3DWidget 創建(位于 SnapdragonSpacesSamples Content > Snapdragon > Common > UI),并在 WidgetComponent 中定義 UI。爲了(le)與凝視控制器或指針控制器配合使用(yòng),該藍圖必須是 BP_3DWidget 的(de)子類。

 

觸覺反饋

要使用(yòng)觸覺反饋,Snapdragon Spaces 提供了(le) SetSpacesHapticsByValue 函數,可(kě)以在藍圖中調用(yòng)。此函數需要以下(xià)參數:玩家控制器、頻(pín)率(Hz)、幅度(Cm)、持續時(shí)間(秒)以及控制器的(de)手部。


圖片17.png