Table of Contents

AR session 的中心模式

中心模式是 Unity AR 的核心概念,它決定了 session 在運行過程中選擇哪個物體作為所有 AR 跟踪的參考點(中心物體),以及 session 中哪些物體可以隨意移動。通過以下內容,您將了解中心模式的基本概念及其對場景中物體運動行為的影響。

開始之前

  • 通過 AR session 簡介了解 session 的基本概念、組成和工作流程。
  • 通過 Camera 了解 AR 場景中攝影機的作用,以及 session 如何控制攝影機的屬性以確保正確的 AR 體驗。
  • 通過 XR Origin 了解 XR Origin 的基本概念、組成和生命週期。
  • 通過 Target 了解 target 的基本概念、狀態和生命週期。

中心物體和中心模式

在一個 session 中,可能同時運行着一個或多個不同的 AR 功能。這些 AR 功能可能會跟踪不同的物體,並且可能會同時使用運動跟踪功能來跟踪設備自身的位置和朝向。

為了確保場景中物體的運動行為符合預期,session 需要選擇一個參考點作為所有 AR 跟踪的中心,這個參考點在 Unity 場景中的代表就是中心物體(CenterObject)。中心模式(CenterMode)是 session 運行過程中決定這個中心物體到底是哪一個物體的規則。

一個 session 的中心可以是以下幾種物體之一:

  • 某個被跟踪的 target
  • XR Origin
  • 攝影機

中心模式決定了 session 選擇哪一個物體作為中心物體,以及這個物體是否可以隨意移動。而這個物體以外的物體(包括非中心的攝影機、XR Origin 和 target)都是受 session 控制,以中心物體為參考點進行運動的。

在 Unity 中,session 支援以下四種中心模式:

名稱 示意圖 描述
FirstTarget

SpecificTarget
alt text 以 target 作為中心,該 target 可以隨意移動。其中,
  • FirstTarget 以第一個被追蹤的 target 作為中心。
  • SpecificTarget 以指定的 target 作為中心。
session 中的 camera 和 XR Origin 以及其他 target 都受 session 控制,以中心 target 為參考點進行運動。
SessionOrigin alt text 以 XR Origin 作為中心,XR Origin 可以隨意移動。
session 中的 camera 和 target 都受 session 控制,以中心 XR Origin 為參考點進行運動。
Camera alt text 以攝影機作為中心,攝影機可以隨意移動。
session 中的 XR Origin 和 target 都受 session 控制,以中心攝影機為參考點進行運動。

示意圖中有三個物體,藍色球體代表 XR Origin,藍色錐體標代表攝影機,黃色圖片代表 target。在不同的中心模式下,session 會選擇不同的物體作為中心物體,圖中顯示了對應物體的局部座標系。

提示

如果您有使用 AR Foundation 的使用經驗,可能會注意到 AR Foundation 中並不存在類似的概念。實際上,AR Foundation 的行為模式與 SessionOrigin 中心模式是一致的。

在 session 中,targetcamera 的相對運動關係由當前 session 控制。XR Origincamera 的相對運動關係,由當前 session 控制或者第三方框架(比如 AR Foundation)控制。中心模式的存在保證了在不同的執行環境下,session 都能正確地控制場景中物體的運動行為。

比如,如果 AR Foundation 或基於 Unity XR 的頭顯 SDK 控制了 XR Origincamera 的相對運動關係,XR Origin 作為 Unity XR 框架的設計,是可以由 session 控制移動的,而 camera 則不行。這時 session 會限制中心模式為 FirstTargetSpecificTargetSessionOrigin,這樣對於 session 來說,中心會是 XR Origin 或某個 target,而對於 Unity XR 框架來說,中心仍然是 XR Origin,整個系統可以完美工作。

警告

在 Unity AR 中,任何存在於 Unity 世界座標系下且未根據 session 元件調整 transform 的物體都可能無法正確顯示。因為 session 會根據中心物體的位置和朝向來調整場景中其它物體的位置和朝向,如果有物體不受 session 控制,它們的位置和朝向就可能與 session 計算出來的位置和朝向不一致,從而導致不可預期的行為。

比如,如果世界座標系下放置了一個熊貓模型,這個熊貓模型的位置和朝向就可能與現實世界中任何物體都沒有對應關係,看上去像是浮在空中或者到處亂動。

正確的做法是始終把要顯示的內容放在某個 target 節點下,或者放在 XR Origin 節點下(如果內容需要跟隨 XR Origin 運動)。這樣內容的位置和朝向就會根據 session 的計算結果進行調整,從而確保內容能夠正確地疊加在現實世界中。

透過手動方式對齊內容和 targetXR Origin 的位置和朝向是可以的,但需要在正確的時間操作,可以參考 選擇合適的中心模式

有效中心模式

並不是所有的中心模式在任何情況下都是有效的。session 會根據當前執行環境和選用的 frame source 來決定哪些中心模式是有效的,從而保證能夠正確地控制場景中物體的運動行為。ARSession.AvailableCenterMode 屬性可以用來取得當前 session 的有效中心模式列表。

根據最終選用的 frame source 的不同,session 的有效中心模式有以下這幾種不同情況:

frame source 攝影機受控 有運動數據 有原點設計 有效中心模式
  • CameraDeviceFrameSource
  • FramePlayer 且錄製時使用的 frame source 無運動數據
  • ExternalImageStreamFrameSource
-
  • FirstTarget
  • SpecificTarget
  • Camera
  • ARCoreFrameSource
  • AREngineFrameSource
  • ARKitFrameSource
  • InertialCameraDeviceFrameSource
  • MotionTrackerFrameSource
  • ThreeDofCameraDeviceFrameSource
  • FramePlayer 且錄製時使用的 frame source 有運動數據
  • FirstTarget
  • SpecificTarget
  • SessionOrigin
  • Camera (*)
* 僅在 camera 不是
XR Origin 子節點時有效
  • ARCoreARFoundationFrameSource
  • ARKitARFoundationFrameSource
  • VisionOSARKitFrameSource
  • XREALFrameSource
  • ExternalDeviceFrameSource 且 OriginTypeXROriginCustom
    • PicoFrameSource
    • RokidFrameSource 且不使用 UXR
  • FirstTarget
  • SpecificTarget
  • SessionOrigin
  • ExternalDeviceFrameSource 且 OriginTypeNone
    • RokidFrameSource 且使用 UXR
  • SessionOrigin

除了使用 FramePlayer 時之外,有效中心模式都是在 session 組裝時確定的。使用 FramePlayer 時,有效中心模式是在 session 執行過程中每幀數據輸出時根據數據中是否包含運動資訊動態決定的。

不同中心模式的特性

接下來,我們將通過一系列範例影片來展示不同中心模式下物體的運動行為。

影片內容如下:

在現實世界中,有兩個不同類型的可跟踪物體:

  • 一個是 聖誕樹,它是靜止不動的。它是通過稀疏空間地圖功能進行跟踪的。
  • 另一個是一張 A4 紙,紙上事先列印好了一張圖片,它是可以移動的。它是通過圖像跟踪功能進行跟踪的。

錄製影片時,觀察者(手機)從聖誕樹的右後方開始,繞着聖誕樹移動。A4 紙在觀察者前方左右擺動。

為了便於觀察,我們對場景中的不同物體添加了一些標識,

  • 聖誕樹:處於跟踪狀態時在其所佔據的空間疊加了 亮藍色點雲。跟踪遺失時這些標識會消失。
  • A4 紙:處於跟踪狀態時在其正上方疊加了一個 熊貓Game 視圖中還額外顯示了一個與 A4 紙內容和大小完全相同的圖片。跟踪遺失時這些標識會消失。
  • XR Origin:在其位置放置了一個 藍色球體
  • 攝影機:在其位置放置了一個 藍色錐體,錐體的主軸與攝影機的視線方向一致。

這些影片均是使用模擬運行數據,在 Unity 編輯器的 Play 模式錄製的。影片左邊是 Scene 視圖,右邊是 Game 視圖。Game 視圖的內容與使用者在現實世界中手機看到的內容是一樣的。

FirstTarget 和 SpecificTarget 中心模式

FirstTarget 和 SpecificTarget 中心模式是以某個 target 作為中心物體的模式。在這兩個模式下,除了中心的 target 之外,session 中的 cameraXR Origin 以及其他 target 都是受 session 控制,以中心 target 為參考點進行運動的。

有些 target 在現實世界中是可以移動的,比如影片中的 A4 紙。

在上面這個影片中,中心物體是通過圖像跟蹤功能跟蹤到的 A4 紙。可以看到,由於沒有外部操作,A4 紙(熊貓)是靜止不動的,而攝像機(藍色錐體)、XR Origin(藍色球體)和 聖誕樹(亮藍色點雲)都在移動。

有些 target 在現實世界中是靜止的,比如影片中的聖誕樹。

在上面這個影片中,中心物體是通過稀疏空間地圖功能跟蹤到的聖誕樹。可以看到,由於沒有外部操作,聖誕樹(亮藍色點雲)是靜止不動的,而攝像機(藍色錐體)和 A4 紙(熊貓)都在移動。XR Origin(藍色球體)也沒有移動,但這是因為它相對聖誕樹是靜止的。

在這兩個模式下,作為參考點的中心 target 可以自由移動,這時 session 中的 cameraXR Origin 以及其他 target 都會跟著動,它們的 transform 不能被外部控制。

在上面這個影片中,中心物體是通過圖像跟蹤功能跟蹤到的 A4 紙。可以看到,由於我們手動移動了 A4 紙(熊貓),攝像機(藍色錐體)、XR Origin(藍色球體)和 聖誕樹(亮藍色點雲)都跟著動了。需要注意的是,這時 Game 視圖顯示的內容並沒有變化,因為攝像機的位置和朝向相對於 A4 紙和其它物體是沒有變化的。

FirstTarget 和 SpecificTarget 模式的區別在於在運行過程中,中心 target 可能產生變化,但變化時中心的選擇方式不同。要說明這個問題,我們要把跟蹤成功和丟失的過程考慮在內。

在 session 中心物體發生變化時, ARSession.CenterObject 會始終反映當前的中心物體,但 ARSession.CenterMode 不會發生改變。

FirstTarget 中心模式的中心變化

FirstTarget 中心模式下,session 始終是以第一個追蹤到的 target 為中心的。如果這個 target 追蹤遺失了,session 會重新選擇中心,當 session 追蹤著或新追蹤上了另一個 target,另一個 target 就會被選作新的中心物體。

重新選擇中心會出現在以下這些情況:

  • 目前影格沒有任何一個 target 在追蹤狀態
    這時如果 SessionOrigin 模式有效,session 會退化到 SessionOrigin 模式選擇 XR Origin 作為中心物體;否則 session 會退化到 Camera 模式選擇 camera 作為中心物體。

  • 目前影格有 target 在追蹤狀態,且上一影格沒有任何一個 target 在追蹤狀態
    這時 session 會選擇其中一個被追蹤的 target 作為中心物體。

  • 目前影格有 target 在追蹤狀態,且上一影格的中心 target 在目前影格追蹤遺失
    這時 session 會選擇其中一個被追蹤的 target 作為新的中心物體。

在上面這個影片中,一開始中心物體是透過影像追蹤功能追蹤到的 A4 紙。可以看到,當 A4 紙(熊貓)追蹤遺失時,session 重新選擇了中心物體,這時聖誕樹(亮藍色點雲)成為了新的中心物體,在影片結尾時,A4 紙重新被追蹤上了,但它並沒有成為中心物體,因為聖誕樹已經是中心物體了。

SpecificTarget 中心模式的中心變化

SpecificTarget 中心模式下,session 始終是以指定的 target 為中心的。如果這個 target 追蹤遺失了,session 會重新選擇中心,但它不會選擇其它 target 作為新的中心物體,當 session 重新追蹤上了這個指定的 target,它仍然會被選作中心物體。

重新選擇中心會出現在以下這些情況:

  • 目前影格指定的 target 未被追蹤
    這時如果 SessionOrigin 模式有效,session 會退化到 SessionOrigin 模式選擇 XR Origin 作為中心物體;否則 session 會退化到 Camera 模式選擇 camera 作為中心物體。

  • 目前影格指定的 target 在追蹤狀態,且上一影格指定的 target 未被追蹤
    這時 session 會選擇指定的 target 作為中心物體。

在上面這個影片中,中心物體被指定為透過影像追蹤功能追蹤到的 A4 紙。可以看到,當 A4 紙(熊貓)追蹤遺失時,session 並沒有選擇其它 target 作為新的中心物體,這時聖誕樹(亮藍色點雲)並沒有成為中心物體。在影片結尾時,A4 紙重新被追蹤上了,它恢復成為了中心物體。

SessionOrigin 中心模式

SessionOrigin 中心模式是以 XR Origin 作為中心物體的模式。在這個模式下,session 中的 cameratarget 都是受 session 控制,以中心 XR Origin 為參考點進行運動的。

在上面這個影片中,中心物體是 XR Origin。可以看到,由於沒有外部操作,XR Origin(藍色球體)是靜止不動的,而攝影機(藍色錐體)和 A4 紙(熊貓)都在移動。聖誕樹(亮藍色點雲)也沒有移動,但這是因為它相對 XR Origin 是靜止的。

在這個模式下,作為參考點的中心 XR Origin 可以自由移動,這時 session 中的 cameratarget 都會跟著動,它們的 transform 不能被外部控制。

在上面這個影片中,中心物體是 XR Origin。可以看到,由於我們手動移動了 XR Origin(藍色球體),攝影機(藍色錐體)、聖誕樹(亮藍色點雲)和 A4 紙(熊貓)都跟著動了。需要注意的是,這時 Game 檢視顯示的內容並沒有變化,因為攝影機的位置和朝向相對於 XR Origin 和其它物體是沒有變化的。

在 SessionOrigin 模式下,XR Origin 是必須有效的,因此這種模式下中心物體不會發生變化。

Camera 中心模式

camera 中心模式是以 camera 作為中心物體的模式。在這個模式下,session 中的 XR Origintarget 都是受 session 控制,以中心 camera 為參考點進行運動的。

在上面這個影片中,中心物體是攝影機。可以看到,由於沒有外部操作,攝影機(藍色錐體)是靜止不動的,而 XR Origin(藍色球體)、聖誕樹(亮藍色點雲)和 A4 紙(熊貓)都在移動。

在這個模式下,作為參考點的中心 camera 可以自由移動,這時session 中的 XR Origintarget 都會跟著動,它們的 transform 不能被外部控制。

在上面這個影片中,中心物體是攝影機。可以看到,由於我們手動移動了攝影機(藍色錐體),XR Origin(藍色球體)、聖誕樹(亮藍色點雲)和 A4 紙(熊貓)都跟著動了。需要注意的是,這時 Game 檢視顯示的內容並沒有變化,因為攝影機的位置和朝向相對於 XR Origin 和其它物體是沒有變化的。

在 Camera 模式下 camera 是必須有效的,因此這種模式下中心物體不會發生變化。

後續步驟

相關主題