錨點示例
此示例演示了如何創建和銷毀本地錨點,以準确跟蹤現實世界中(zhōng)的一個點。有(yǒu)關錨點的基本信息以及 AR Foundation 的 AR Anchor Manager 組件的功能(néng),請參考 Unity 文(wén)檔。要使用(yòng)此功能(néng),需要在 OpenXR 插件設置中(zhōng)啓用(yòng)該選項,路徑為(wèi):項目設置 > XR 插件管理(lǐ) > OpenXR (> Android 标簽)。
示例工(gōng)作(zuò)原理(lǐ)
首先,請确保在 OpenXR 項目設置中(zhōng)啓用(yòng)了空間錨點功能(néng)。
為(wèi)了放置錨點,一個透明的放置工(gōng)具(jù)将浮動在攝像機中(zhōng)心,距離為(wèi) 1 米。如果啓用(yòng)了“在表面上放置錨點”切換按鈕,每幀都會從頭部中(zhōng)心向前發射一條射線(xiàn),以确定放置工(gōng)具(jù)相對于現實世界平面的定位。如果檢測到碰撞,放置工(gōng)具(jù)會變為(wèi)黃色。然後,點擊主控制器上的觸控闆或與可(kě)見的 UI 面闆上的凝視交互(如果選中(zhōng)凝視交互器),将會實例化一個空的 GameObject 和一個 ARAnchor GameObject。空的 GameObject 具(jù)有(yǒu)一個透明的工(gōng)具(jù)網格,并由 AR Session 進行跟蹤。AR 錨點工(gōng)具(jù)将通過 ARAnchorManager 的 anchorsChanged 事件進行更新(xīn),以表示其跟蹤狀态。
銷毀所有(yǒu)錨點
通過點擊 UI 中(zhōng)的“銷毀所有(yǒu)錨點”按鈕,可(kě)以銷毀所有(yǒu)錨點和工(gōng)具(jù)。為(wèi)了防止在所有(yǒu)内容删除後再次使用(yòng)“選擇”按鈕創建新(xīn)的錨點,删除命令會有(yǒu)延遲發出。
Spaces 錨點存儲
通過在 AR Anchor Manager 旁邊添加 Spaces Anchor Store 組件,可(kě)以将錨點本地保存,以便在後續會話中(zhōng)識别和跟蹤。該組件提供了以下 API,用(yòng)于加載和保存錨點、删除保存的錨點以及清除本地錨點存儲。
在這部分(fēn)信息遷移到腳本 API 之前,以下是這些方法的簡要說明:
● ClearStore
○ 清除本地錨點存儲。
● SaveAnchor
○ 通過指定的名(míng)稱或生成的哈希值保存 AR Anchor 對象,保存完成後可(kě)以調用(yòng)回調函數。
● SaveAnchorWithResult
通過指定的名(míng)稱或生成的哈希值保存 AR Anchor 對象,保存完成後可(kě)以調用(yòng)回調函數。
● SaveAnchorResult 的可(kě)能(néng)值包括:
○ PENDING: 錨點待保存。無法正常查看,請使用(yòng) ARAnchor.pending 進行檢查。
○ SAVED: 成功保存到本地存儲中(zhōng)。
○ FAILURE_RUNTIME_ERROR: 由于運行時錯誤,未能(néng)保存到本地存儲中(zhōng)。
○ FAILURE_STORE_NOT_LOADED: 由于 Spaces Anchor Store 加載失敗,未能(néng)保存到本地存儲中(zhōng)。
○ FAILURE_INSUFFICIENT_QUALITY: 由于環境地圖質(zhì)量不足,未能(néng)保存到本地存儲中(zhōng)。
● DeleteSavedAnchor
通過名(míng)稱從本地存儲中(zhōng)删除已保存的錨點。
● LoadSavedAnchor
○ 從本地存儲中(zhōng)加載錨點,并嘗試在場景中(zhōng)定位該錨點。如果找到錨點,将實例化一個 AR Anchor 對象。加載的錨點将在 ARAnchorManager 的 anchorsChanged 事件中(zhōng)列為(wèi)已添加。保存的錨點名(míng)稱可(kě)以通過 GetSavedAnchorNames 方法獲取。保存完成後可(kě)以調用(yòng)回調函數。
● LoadAllSavedAnchors
從存儲中(zhōng)加載所有(yǒu)錨點,并嘗試在場景中(zhōng)定位它們。與 LoadSavedAnchor 方法類似,識别到的錨點将實例化為(wèi) AR Anchor 對象。
● GetSavedAnchorNames
返回所有(yǒu)已保存錨點的名(míng)稱。
● GetSavedAnchorNameFromARAnchor
○ 如果跟蹤到的 AR Anchor 對象是之前保存的,方法将返回其名(míng)稱;否則返回空字符串。此方法可(kě)用(yòng)于檢查一個錨點是否為(wèi)已保存的錨點。
在示例中(zhōng)保存、删除和加載錨點
通過啓用(yòng)“将新(xīn)錨點保存到本地存儲”選項,每當創建新(xīn)的錨點時,它都會被保存到本地應用(yòng)存儲中(zhōng)。這意味着,隻要場景中(zhōng)有(yǒu) AR Anchor Manager,該錨點就可(kě)以像其他(tā)常規錨點一樣被重新(xīn)創建和跟蹤。為(wèi)了區(qū)分(fēn)常規錨點和已保存的錨點,在錨點的中(zhōng)心會生成一個額外的立方體(tǐ)網格。如果立方體(tǐ)是紅色,表示該錨點未被跟蹤;如果是白色,則表示正在跟蹤。點擊“加載所有(yǒu)已保存的錨點”将從本地存儲中(zhōng)加載所有(yǒu)錨點,并嘗試在場景中(zhōng)定位它們。點擊“清除存儲”将删除所有(yǒu)保存在本地存儲中(zhōng)的錨點,但不會影響從存儲中(zhōng)加載的現有(yǒu)錨點。