錨點示例
這個示例演示了如何創建和銷毀本地以及保存的錨點,以準确跟蹤現實世界中(zhōng)的某個點,有(yǒu)關錨點的基本信息以及 Unreal Engine 中(zhōng)的 ARPin 和 ARPin 本地存儲的工(gōng)作(zuò)原理(lǐ),請參閱 Unreal Engine 文(wén)檔。要使用(yòng)此功能(néng),必須在 OpenXR 插件設置中(zhōng)啓用(yòng)它,設置位置在 項目設置 > Snapdragon Spaces 插件。
示例工(gōng)作(zuò)原理(lǐ)
默認情況下,當打開示例時,會在相機前方 1 米處顯示一個白色的指示器。如果在相機前方檢測到碰撞,指示器将變為(wèi)黃色,并移動到碰撞位置。在此示例中(zhōng),用(yòng)戶可(kě)以通過兩種方式将指示器放置在當前位置:點擊控制器上的選擇按鈕,或者在啓用(yòng)注視控制器時使用(yòng)浮動 UI 中(zhōng)的“創建”按鈕。
當指示器被放置時,首先會顯示一個簡單的白色指示器,表示它不是 ARPin 也沒有(yǒu)被跟蹤。如果底層功能(néng)報告一個被跟蹤的錨點,指示器會變為(wèi)紅色、綠色和藍色,并将一個 ARPin 附加到對象上。如果被跟蹤的指示器不再跟蹤或 ARPin 創建失敗,指示器會變為(wèi)紅色。如果錨點已保存到本地錨點存儲中(zhōng),指示器中(zhōng)心會顯示一個立方體(tǐ)網格組件。
用(yòng)戶在此示例中(zhōng)可(kě)以使用(yòng)的選項包括:
● 銷毀所有(yǒu)錨點:一個按鈕,用(yòng)于删除世界中(zhōng)所有(yǒu)本地指示器。此操作(zuò)不會删除存儲中(zhōng)的已保存錨點。
● 加載所有(yǒu)已保存的錨點:一個按鈕,用(yòng)于加載所有(yǒu)已保存的錨點,并将它們顯示為(wèi)世界中(zhōng)的本地指示器。
● 清空存儲:一個按鈕,用(yòng)于從存儲中(zhōng)移除所有(yǒu)已保存的錨點。此操作(zuò)不會清除世界中(zhōng)的本地指示器。
● 将創建的錨點保存到本地存儲:一個複選框,用(yòng)于在創建時将本地指示器保存為(wèi)已保存的錨點。
錨點管理(lǐ)
BP_AnchorManager 藍圖(位于 SnapdragonSpacesSamples 内容 > SnapdragonSpaces > Samples > Anchor > Placeable)負責集中(zhōng)管理(lǐ)創建和銷毀指示器的操作(zuò),該藍圖将事件綁定到角色,以便與示例進行交互(在這種情況下,是控制器上的選擇點擊)。
要啓用(yòng)和禁用(yòng)空間錨點,必須使用(yòng) Toggle Spaces Feature 方法,并将 Spatial Anchor 作(zuò)為(wèi)功能(néng)選項。
在 BP_Pawn 中(zhōng),添加了一個 SceneComponent 作(zuò)為(wèi)未放置指示器的根組件,開發人員可(kě)以自定義未放置指示器的一些選項:
● AnchorTag:定義在 BP_Pawn 中(zhōng)的 SceneComponent 上的标簽名(míng)稱,用(yòng)于未放置指示器的根組件。
● DistanceGizmo:未放置指示器距離相機的距離。
要放置指示器,管理(lǐ)器會将指示器從根組件中(zhōng)分(fēn)離,并使用(yòng)其變換來創建 ARPin 指示器。
此外,你還可(kě)以學(xué)習如何在 Update Hit 函數中(zhōng)将錨點實現與命中(zhōng)測試結合起來。
指示器
BP_Gizmo 藍圖文(wén)件(位于 SnapdragonSpacesSamples 内容 > SnapdragonSpaces > Samples > Anchor > Placeable)負責創建 ARPin。這個操作(zuò)使用(yòng)了 PinComponent 節點,如下圖所示。
警告! 對于 SnapdragonSpaces 插件,必須指定要固定的組件(Component to Pin)以及組件應被固定的變換(Pin to World Transform),如果這兩個輸入中(zhōng)的任何一個為(wèi)空,ARPin 的創建将會失敗。 |
如果指示器啓用(yòng)了 bAutoSave 變量,則在分(fēn)配 ARPin 後,錨點将自動保存到錨點存儲中(zhōng)。錨點保存過程是異步進行的。OnSpacesAnchorIsSavedInfoResult 委托用(yòng)于指示保存是否成功,調用(yòng)可(kě)能(néng)返回以下結果:
● 成功:錨點已成功保存到存儲中(zhōng)。
● 一般失敗:由于 OpenXR 失敗,錨點未能(néng)保存。
● 質(zhì)量不足失敗:由于環境質(zhì)量不足,錨點未能(néng)保存。
● 錨點未創建:由于錨點創建尚未完成,錨點未能(néng)保存。
● 錨點存儲失敗:由于錨點存儲無效,錨點未能(néng)保存。
● 錨點無效:由于錨點值無效,錨點未能(néng)保存。
● 錨點已銷毀:由于錨點正在等待銷毀,錨點未能(néng)保存。
在藍圖的每次 tick 中(zhōng),會處理(lǐ) Pin 狀态的管理(lǐ)。
最後,當指示器被銷毀且存在有(yǒu)效的 ARPin 時,會手動移除 Pin。
加載和保存錨點
警告! 确保檢查環境,以生成更好的跟蹤地圖,從而減少保存和加載時間。一次性保存多(duō)個錨點會阻塞主線(xiàn)程,因此應使用(yòng)回調來保存任何後續的錨點。 |
OpenXR 接口提供了加載和保存 ARPins 到本地存儲的功能(néng)。在使用(yòng) Snapdragon Spaces 插件時,這些操作(zuò)會在異步線(xiàn)程中(zhōng)進行,以避免應用(yòng)程序凍結。因此,開發人員需要注意:
● 從本地存儲加載 ARPins
○ 從本地存儲中(zhōng)加載所有(yǒu) ARPins。該節點返回一個包含名(míng)稱和 ARPins 的映射。此時,這些 ARPins 尚未加載,其狀态将顯示為(wèi)“未跟蹤”,直到異步線(xiàn)程完成加載。當加載完成後,ARPin 的狀态将自動更新(xīn)。
● 将 ARPin 保存到本地存儲
○ 将 ARPin 保存到本地存儲。此節點使用(yòng)名(míng)稱作(zuò)為(wèi) ID 來保存 ARPin(該名(míng)稱會在加載節點中(zhōng)返回)。開發人員應使用(yòng) On Spaces Anchor Is Saved 委托來了解保存操作(zuò)是否成功完成。
Snapdragon Spaces 插件提供了額外的功能(néng)來幫助管理(lǐ)藍圖中(zhōng)的已保存錨點:
● 獲取已保存錨點名(míng)稱
○ 返回存儲中(zhōng)所有(yǒu)已保存錨點的名(míng)稱。
● 獲取 ARPin 的已保存錨點名(míng)稱
○ 返回用(yòng)于在存儲中(zhōng)保存 ARPin 的名(míng)稱。