圖像跟蹤示例
此示例演示了(le)如何檢測和(hé)增強現實世界中的(de)圖像目标。有關圖像跟蹤的(de)基本信息以及 AR Foundation 的(de) AR Tracked Image Manager 組件的(de)功能,請參閱 Unity 文檔。要使用(yòng)此功能,必須在 OpenXR 插件設置中啓用(yòng)它,路徑爲 Project Settings > XR Plug-in Management > OpenXR (> Android Tab)。
示例工作原理(lǐ)
首先,确保在 OpenXR 項目設置中啓用(yòng)了(le)圖像跟蹤功能。
提示! 你可(kě)以在“測試用(yòng)圖像目标”部分(fēn)找到使用(yòng)的(de)參考圖像。 |
圖像目标通(tōng)過 XR Reference Image Library 提供給底層 XR 插件。添加的(de)圖像需要有一個(gè)名稱,這(zhè)将有助于以後識别被跟蹤的(de)目标。此外,還(hái)需要将“Keep Texture at Runtime”标志設置爲 true。這(zhè)将使子系統能夠将紋理(lǐ)數據傳遞給 Snapdragon Spaces Services 以進行跟蹤。
此外,在示例中,圖像目标的(de)高(gāo)度爲 26 厘米(當打印爲 DIN A4 或 US letter 尺寸時(shí))。正确的(de)尺寸對(duì)于準确的(de)姿态估計和(hé)後續的(de)增強現實放置至關重要。因此,啓用(yòng)“Specify Size”選項後,必須指定圖像目标的(de)實際尺寸。
在導入設置中,紋理(lǐ)的(de)“讀取/寫入”标志應啓用(yòng),并将格式設置爲 RGB 24 位(也(yě)可(kě)能顯示爲 RGB8)。如果格式設置爲“自動”,項目的(de)圖形設置可(kě)能會錯誤地指定格式。
将 ARTrackedImageManager 組件添加到 ARSessionOrigin GameObject 中,将啓用(yòng) Snapdragon Spaces 包中的(de)圖像跟蹤子系統。該組件提供了(le)三個(gè)字段:一個(gè)用(yòng)于之前創建的(de) RuntimeReferenceImageLibrary,一個(gè)用(yòng)于指定最大(dà)移動圖像數量,另一個(gè)用(yòng)于定義在檢測到跟蹤圖像時(shí)生成的(de)預制體。所使用(yòng)的(de)預制體是一個(gè)指示跟蹤圖像方向的(de) gizmo。
通(tōng)過訂閱 ARTrackedImageManager 的(de)方法以監聽(tīng)跟蹤圖像的(de)變化(huà),可(kě)以爲跟蹤圖像的(de)狀态和(hé)位置設置相應的(de) UI 信息,如下(xià)方的(de)簡化(huà)代碼示例所示。
警告! 爲了(le)使此示例正常工作,XR Reference Image Library 中設置的(de)參考圖像名稱必須唯一。任何重複的(de)名稱會導緻 _trackedImages 字典中的(de)哈希碼沖突。 |
可(kě)選的(de) Spaces Reference Image Configurator 組件也(yě)可(kě)以添加到與 ARTrackedImageManager 相同的(de) GameObject 上。該組件爲每個(gè)跟蹤圖像提供了(le)額外的(de)配置選項。
Tracking Mode 字段允許爲每個(gè)圖像定義三種不同的(de)跟蹤模式之一:
● 動态(默認) - 動态模式每幀更新跟蹤圖像的(de)位置,适用(yòng)于移動和(hé)靜态目标。如果找不到跟蹤圖像,則不會報告位置或姿态。相較于其他(tā)跟蹤模式,此模式的(de)功耗較高(gāo)。如果沒有找到 Spaces Reference Image Configurator 組件,所有跟蹤圖像将默認使用(yòng)此模式。
● 靜态 - 靜态模式适用(yòng)于已知爲靜态的(de)圖像,這(zhè)樣可(kě)以降低功耗并提高(gāo)性能。例如,這(zhè)些圖像可(kě)能固定在地闆或牆壁上。此模式适用(yòng)于持續顯示增強現實效果,即使圖像不再可(kě)見。靜态模式下(xià)的(de)圖像位置不會更新,無論圖像是否移動或超出視線。
● 自适應 - 自适應模式适用(yòng)于靜态圖像,但如果圖像移動,會定期更新跟蹤圖像的(de)姿态,大(dà)約每 5 幀更新一次。如果頭戴顯示器(HMD)移動了(le),圖像姿态會根據顯示刷新率進行調整。對(duì)于超出視線的(de)圖像,跟蹤最終會丢失。此模式在功耗和(hé)跟蹤精度之間取得(de)平衡,适用(yòng)于将保持固定位置的(de)圖像。
模式 | 添加 | 更新 | 移除 |
動态(默認) | 進入幀時(shí) | 每幀更新 | 退出幀時(shí) |
靜态 | 進入幀時(shí) | 不更新 | 新圖像被跟蹤 |
自适應 | 進入幀時(shí) | 周期性更新(大(dà)約每 5 幀更新一次,圖像移動時(shí)) | 退出幀時(shí) |
在啓動應用(yòng)程序時(shí),每個(gè)被跟蹤的(de)圖像會初始使用(yòng)在 Spaces Reference Image Configurator 組件中定義的(de)跟蹤模式,但如果需要,可(kě)以在運行時(shí)更新此值,如下(xià)面的(de)簡化(huà)示例代碼所示。
運行時(shí)切換參考庫
可(kě)以在運行時(shí)更換 AR Tracked Image Manager 使用(yòng)的(de)參考圖像庫,而無需切換場(chǎng)景,爲實現這(zhè)一點,請注意以下(xià)事項;
● 必須重新啓動圖像跟蹤子系統以使庫更改生效。這(zhè)可(kě)以通(tōng)過重新啓用(yòng) AR Tracked Image Manager 組件來(lái)完成。
● 必須在 Spaces Reference Image Configurator 組件中重新同步新的(de)庫的(de)跟蹤模式,使用(yòng)組件的(de) SyncTrackingModes 函數。需要提供一個(gè)包含參考圖像名稱和(hé)所需初始跟蹤模式的(de) Dictionary<string, SpacesImageTrackingMode> 作爲參數。
警告! 如果在更換庫時(shí)未重新應用(yòng)跟蹤模式,則 Spaces Reference Image Configurator 的(de) SetTrackingModeForReferenceImage 函數在未找到先前庫中的(de)參考圖像名稱時(shí)會失敗。 在這(zhè)種情況下(xià),動态模式将作爲參考圖像的(de)默認跟蹤模式。 |
下(xià)面的(de)示例代碼實現了(le)一個(gè) SwapTargetLibrary 函數,用(yòng)于在運行時(shí)切換到不同的(de)參考圖像庫。首先禁用(yòng) Tracked Image Manager 組件,然後在 Spaces Reference Image Configurator 組件的(de) SyncTrackingModes 函數中重新同步圖像跟蹤模式。參考圖像名稱和(hé)所需初始跟蹤模式的(de) Dictionary<string, SpacesImageTrackingMode> 由輔助函數 CreateTrackingModesDictionary 提供。最後,将新的(de)參考庫應用(yòng)于 AR Tracked Image Manager 組件,并重新啓用(yòng)該組件。