本地錨點

錨點示例

此示例演示了(le)如何創建和(hé)銷毀本地錨點,以準确跟蹤現實世界中的(de)一個(gè)點。有關錨點的(de)基本信息以及 AR Foundation 的(de) AR Anchor Manager 組件的(de)功能,請參考 Unity 文檔。要使用(yòng)此功能,需要在 OpenXR 插件設置中啓用(yòng)該選項,路徑爲:項目設置 > XR 插件管理(lǐ) > OpenXR (> Android 标簽)。

 

示例工作原理(lǐ)

首先,請确保在 OpenXR 項目設置中啓用(yòng)了(le)空間錨點功能。

 

爲了(le)放置錨點,一個(gè)透明(míng)的(de)放置工具将浮動在攝像機中心,距離爲 1 米。如果啓用(yòng)了(le)“在表面上放置錨點”切換按鈕,每幀都會從頭部中心向前發射一條射線,以确定放置工具相對(duì)于現實世界平面的(de)定位。如果檢測到碰撞,放置工具會變爲黃(huáng)色。然後,點擊主控制器上的(de)觸控闆或與可(kě)見的(de) UI 面闆上的(de)凝視交互(如果選中凝視交互器),将會實例化(huà)一個(gè)空的(de) GameObject 和(hé)一個(gè) ARAnchor GameObject。空的(de) GameObject 具有一個(gè)透明(míng)的(de)工具網格,并由 AR Session 進行跟蹤。AR 錨點工具将通(tōng)過 ARAnchorManager 的(de) anchorsChanged 事件進行更新,以表示其跟蹤狀态。

 

圖片56.png

 

銷毀所有錨點

 

圖片57.png


通(tōng)過點擊 UI 中的(de)“銷毀所有錨點”按鈕,可(kě)以銷毀所有錨點和(hé)工具。爲了(le)防止在所有内容删除後再次使用(yòng)“選擇”按鈕創建新的(de)錨點,删除命令會有延遲發出。

 

Spaces 錨點存儲

 

圖片58.png


通(tōng)過在 AR Anchor Manager 旁邊添加 Spaces Anchor Store 組件,可(kě)以将錨點本地保存,以便在後續會話(huà)中識别和(hé)跟蹤。該組件提供了(le)以下(xià) API,用(yòng)于加載和(hé)保存錨點、删除保存的(de)錨點以及清除本地錨點存儲。

 

圖片59.png


在這(zhè)部分(fēn)信息遷移到腳本 API 之前,以下(xià)是這(zhè)些方法的(de)簡要說明(míng):

 

●  ClearStore

 ○ 清除本地錨點存儲。

●  SaveAnchor

 ○ 通(tōng)過指定的(de)名稱或生成的(de)哈希值保存 AR Anchor 對(duì)象,保存完成後可(kě)以調用(yòng)回調函數。

●  SaveAnchorWithResult

通(tōng)過指定的(de)名稱或生成的(de)哈希值保存 AR Anchor 對(duì)象,保存完成後可(kě)以調用(yòng)回調函數。

● SaveAnchorResult 的(de)可(kě)能值包括:

 ○ PENDING: 錨點待保存。無法正常查看,請使用(yòng) ARAnchor.pending 進行檢查。

 ○ SAVED: 成功保存到本地存儲中。

 ○ FAILURE_RUNTIME_ERROR: 由于運行時(shí)錯誤,未能保存到本地存儲中。

 ○ FAILURE_STORE_NOT_LOADED: 由于 Spaces Anchor Store 加載失敗,未能保存到本地存儲中。

 ○  FAILURE_INSUFFICIENT_QUALITY: 由于環境地圖質量不足,未能保存到本地存儲中。

 

●  DeleteSavedAnchor

通(tōng)過名稱從本地存儲中删除已保存的(de)錨點。

●  LoadSavedAnchor

 ○ 從本地存儲中加載錨點,并嘗試在場(chǎng)景中定位該錨點。如果找到錨點,将實例化(huà)一個(gè) AR Anchor 對(duì)象。加載的(de)錨點将在 ARAnchorManager 的(de) anchorsChanged 事件中列爲已添加。保存的(de)錨點名稱可(kě)以通(tōng)過 GetSavedAnchorNames 方法獲取。保存完成後可(kě)以調用(yòng)回調函數。

●  LoadAllSavedAnchors

從存儲中加載所有錨點,并嘗試在場(chǎng)景中定位它們。與 LoadSavedAnchor 方法類似,識别到的(de)錨點将實例化(huà)爲 AR Anchor 對(duì)象。

●  GetSavedAnchorNames

返回所有已保存錨點的(de)名稱。

●  GetSavedAnchorNameFromARAnchor

 ○ 如果跟蹤到的(de) AR Anchor 對(duì)象是之前保存的(de),方法将返回其名稱;否則返回空字符串。此方法可(kě)用(yòng)于檢查一個(gè)錨點是否爲已保存的(de)錨點。

 

在示例中保存、删除和(hé)加載錨點

通(tōng)過啓用(yòng)“将新錨點保存到本地存儲”選項,每當創建新的(de)錨點時(shí),它都會被保存到本地應用(yòng)存儲中。這(zhè)意味著(zhe),隻要場(chǎng)景中有 AR Anchor Manager,該錨點就可(kě)以像其他(tā)常規錨點一樣被重新創建和(hé)跟蹤。爲了(le)區(qū)分(fēn)常規錨點和(hé)已保存的(de)錨點,在錨點的(de)中心會生成一個(gè)額外的(de)立方體網格。如果立方體是紅色,表示該錨點未被跟蹤;如果是白色,則表示正在跟蹤。點擊“加載所有已保存的(de)錨點”将從本地存儲中加載所有錨點,并嘗試在場(chǎng)景中定位它們。點擊“清除存儲”将删除所有保存在本地存儲中的(de)錨點,但不會影(yǐng)響從存儲中加載的(de)現有錨點。