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