Table of Contents

Unity ar 的運動追蹤中心 —— Xr origin

Xr origin 是 Unity 中運動追蹤功能的核心概念。在現代 ar 應用中,運動追蹤正在逐步成為必不可少的功能。通過運動追蹤,應用可以在不借助其它識別物的前提下了解用戶在現實世界中的位置和朝向,從而實現沉浸式的 ar 體驗。通過以下內容,您將了解 xr origin 的基本概念、組成和生命週期,以及在什麼情況下需要使用 xr origin。

開始之前

  • 通過 Arsession 簡介了解 session 的基本概念、組成和工作流程。

Xr origin 是什麼

運動追蹤功能初始化時會選擇一個參考點作為追蹤的原點。這個參考點一般是用戶啟動應用時或是系統 ar 服務啟動時設備所在的位置。這個參考點在 Unity 場景中的代表就是 xr origin。在大多數情況下,xr origin 在場景中的起始位置也是攝影機的預設起始位置。

這段影片展示了一個簡單的只有運動追蹤在運行的 ar 場景。影片左邊是 Hierarchy 檢視,中間是 Scene 檢視,右邊是 Game 檢視。影片是使用模擬運行數據,在 Unity 編輯器的 Play 模式錄製的。Game 檢視的內容與用戶在現實世界中手機看到的內容是一樣的。

可以看到,在這段影片裡,xr origin(藍色球體)在場景中的位置是固定的,而代表用戶的攝影機(攝影機圖示)會根據用戶在現實世界中的移動而移動。白色錐體截取了過去一段時間內攝影機的位置和朝向軌跡,可以更好地理解攝影機在場景中的運動情況。可以看到這些白色錐體是生成在 xr origin 的節點下的,這也是這類場景中物體的典型組織結構。

在 Unity 的運動追蹤系統中,攝影機一般是跟隨 xr origin 進行運動的。雖然攝影機並不一定是 xr origin 的子節點,但 ar session 會根據 xr origin 的位置來計算攝影機的位置,從而保證用戶看到的內容和現實世界中的內容一致。

這段影片展示了同樣的場景,不過這次我們在運行時移動了 xr origin(藍色球體)。可以看到,xr origin 被移動後,攝影機會跟隨 xr origin 進行運動,而 Game 檢視中的內容並沒有變化。

在實際的 ar 場景中,這種運動關係要更加複雜一些。

Xr origin 在不同中心模式下的行為

在 Unity 中,所有 ar 追蹤的中心參考點被稱為 session 中心,而 session 運行過程中決定這個中心的規則被稱為中心模式。在不同的中心模式下,xr origin 的行為有所不同:

  • SessionOrigin 中心模式下,xr origin 是可以隨意移動的。

    一般 SessionOrigin 模式會在只有運動追蹤在工作的場景中使用。在有其牠功能同時運行時,通常不會使用 SessionOrigin 模式。

    不過在使用頭顯時,如果廠商沒有在 Unity 中正確實現運動追蹤的參考點,這時就必須使用 Unity 的世界中心從而強制使用 SessionOrigin 模式。這種情況要求內容根節點要跟隨 ar 功能進行運動,這可能會影響內容效果,但在第三方廠商做出更改之前並沒有其它辦法。

  • 在其它中心模式(比如 FirstTarget)下,xr origin 是不能隨意移動的。

    一般 FirstTarget 模式在非運動追蹤或有其它 ar 功能與運動追蹤同時運行的場景中使用。

    在這種模式下,xr origin 的位置是由 ar 功能決定的,因此不能隨意移動 xr origin。

關於中心模式以及場景內物體的運動方式可以詳細參考: 中心模式

Xr origin 的形式和組成

EasyAR 可以使用兩種不同形式的 xr origin:

  • EasyAR 提供的 xr origin
  • Unity xr 框架提供的 xr origin

Xr origin (EasyAR)

典型的 xr origin 結構如下所示:

alt text

Xr origin 根節點是一個空的 GameObject,它可以有一個或多個 xr origin child 子節點。Xr origin child 包含了一個 XROriginChildController 組件,用於代理 xr origin 的控制邏輯。

session 運行時,如果場景中沒有正確的 xr origin 結構,xr origin 和一個 xr origin child 會被自動創建。運行過程中,xr origin child 會被約束在 xr origin 相同的位置和朝向下。

由 session 生成的物體,比如稀疏空間地圖建圖的點雲,或是稠密空間建圖的網格,會被創建在 xr origin child 節點下。

這段影片展示相同場景下在運動追蹤同時運行了稠密空間建圖的效果。可以看到生成的網格是被創建在 xr origin child 節點下的。

註:為了便於理解,影片中關閉了深度圖生成,因此影片中 Scene 檢視的內容與實際運行時顯示的內容會有差異。Game 檢視的顯示效果與關閉 mesh 透明時相同。

[可選] Xr origin (Unity xr)

如果需要,可以選擇使用 Unity xr 框架提供的 Xr origin 組件。

在使用 Unity xr 框架提供的 xr origin 時,一個典型的結構如下所示:

alt text

在頭顯場景中,一個典型的結構如下所示:

alt text

Xr origin 根節點是由 Unity xr 框架創建和維護的 GameObject,它可以有一個或多個 xr origin child 子節點。Xr origin child 包含了一個 XROriginChildController 組件,用於代理 xr origin 的控制邏輯。

session 運行時,如果場景中沒有正確的 xr origin child 結構,xr origin child 會被自動創建。運行過程中,xr origin child 會被約束在 xr origin 相同的位置和朝向下。

Unity xr 框架提供的 xr origin 主要為以下兩種情況提供支持:

  • 您已經在專案中使用了 AR Foundation,並希望與 EasyAR 同時工作或根據設備支持情況在兩者之間切換。
  • 您所使用的頭顯 sdk 使用了 Unity xr 框架提供的 xr origin 組件。
附註

當 Unity xr 的核心包 com.unity.xr.core-utils 未被導入到工程中時,如果場景中的攝影機處於與 Unity xr 框架提供的 xr origin 相同的層級結構中(Camera 及名為 Camera Offset 父節點),session 會假定這個結構是 Unity xr 框架創建的並使用它。這樣做是為了給場景提供最大限度的兼容性,即:使用 AR Foundation 創建的場景,在 AR Foundation 未被導入工程中時,AR Foundation 不會工作但剩餘的 ar 功能仍能正常工作。除了只有 AR Foundation 能提供的功能之外,這甚至不影響整個 ar 應該的功能性和設備兼容性。

大多數的 EasyAR 的示例場景都使用了這種方式來保證在沒有 AR Foundation 的情況下仍然可以運行,且在 AR Foundation 存在時可以展示與 AR Foundation 的協同工作能力。

在 AR Foundation 的定義中,它的 xr origin 是 xr 場景中追蹤空間的中心。不過需要注意的是,在 AR Foundation 的概念中,運動追蹤被作為必選功能,它所描述的 xr 場景中的追蹤就是運動追蹤。

在 EasyAR 系統中,運動追蹤是一個可選的功能,因此 xr origin 也是可選的。Xr origin 只在啟用了運動追蹤功能時才會創建和使用。

Xr origin 的生命週期

Xr origin 的生命週期依託於 session。在 session 啟動時,xr origin 會被選定或被創建(如果場景中沒有正確的 xr origin 結構)。在 session 停止時,xr origin 會留在原地直至被下一個 session 使用或被手動刪除。

後續步驟

創建

控制運行

相關主題