ARFoundation之路-可跟蹤對象

  在ARFoundation中,平面(Plane)、特徵點雲(Point Cloud)、參考點(Reference Point)、增強圖像(Tracked Image)、環境探頭(Environment Probe)、人臉(Face)、3D物體(Tracked Object)這七類對象稱爲可跟蹤對象(trackable),也即是說ARFoundation目前可以實時的跟蹤處理這七類對象。當然,這七類對象是否都支持還與平臺底層SDK有關,如3D物體跟蹤目前只能用在ARKit中。

  爲方便管理各類可跟蹤對象,ARFoundation爲每一類可跟蹤對象都建立了一個對應的管理器(Manager),一種管理器只管理對應的一類可跟蹤對象,這種設計大大的提高了靈活性,可以非常方便的添加或者刪除每類管理器,從而達到只對特定可跟蹤對象進行處理的目的。

  需要特別注意的時,可跟蹤對象管理器只能掛載在與AR Session Origin相同的一個對象上,這是因爲AR Session Origin定義了Session空間與Unity空間的轉換關係,可跟蹤對象管理器需要利用Session原點及轉換關係才能將可跟蹤對象定位在Unity空間中的正確位置。一個掛載了所有可跟蹤對象的AR Session Origin對象如下圖所示。

在這裏插入圖片描述

(一)可跟蹤對象管理器

  添加某種可跟蹤對象管理器即可開始對這種類型的可跟蹤對象進行管理,刪除或者禁用一種可跟蹤對象管理器即終止對這種類型的可跟蹤對象的管理,Unity對可跟蹤對象的這種處理非常簡單易用。各管理器與可跟蹤對象的對應關係如下表所示。

可跟蹤對象 可跟蹤對象管理器 說明
ARPlane ARPlaneManager 檢測與管理平面,包括垂直平面與水平平面。
ARPointCloud ARPointCloudManager 檢測與管理特徵點雲。
ARReferencePoint ARReferencePointManager 檢測與管理參考點,可以通過ARReferencePointManager.AddReferencePoint 和 ARReferencePointManager.RemoveReferencePoint添加和移除參考點。
ARTrackedImage ARTrackedImageManager 檢測與管理2D圖像跟蹤。
AREnvironmentProbe AREnvironmentProbeManager 管理環境探頭生成Cubemaps。
ARFace ARFaceManager 檢測與管理人臉跟蹤。
ARTrackedObject ARTrackedObjectManager 檢測與管理3D物體對象。

  在添加某類可跟蹤對象管理器後,該類可跟蹤對象姿態每幀都會被ARFoundation更新,但是管理器並不負責可視化可跟蹤對象,即管理器只負責存儲可跟蹤對象的數據信息,但不對數據進行其他加工處理。

  如前所述,啓用或者添加可跟蹤管理器將啓用某類跟蹤功能。例如,可以通過啓用或禁用ARPlaneManager來啓用或者禁用平面檢測功能。另外需要注意的是,跟蹤對象是一個非常消耗資源的工作,因此最好在不使用某類可跟蹤對象時禁用或者刪除其管理器。

(二)可跟蹤對象事件

  每一個可跟蹤對象都可以被添加、更新、刪除。在第一幀中,對應的管理器會對該類所有的可跟蹤對象狀態進行檢測,把新的可跟蹤對象加進來、對現跟蹤的對象進行姿態更新、刪除 陳舊過時的可跟蹤對象。有時我們可能需要在特定事件發生時做一些操作,對此,所有的管理器都會提供一個事件,我們可以訂閱該事件以做對應處理。

可跟蹤對象管理器 事件
ARPlaneManager planesChanged
ARPointCloudManager pointCloudsChanged
ARReferencePointManager referencePointsChanged
ARTrackedImageManager trackedImagesChanged
AREnvironmentProbeManager environmentProbesChanged
ARFaceManager facesChanged
ARTrackedObjectManager trackedObjectsChanged

(三)管理可跟蹤對象

  ARFoundation中的可跟蹤對象,有的可以手動添加刪除,有的則是自動管理不需人工參與。如Reference Points和Enveronment probes,這兩個可跟蹤對象可以手動添加和刪除,Plane和Face等其他的可跟蹤對象則完全由ARFoundation自動管理。還有一些是既可以自動管理,也可以手動添加刪除,如PointCloud。

  由於每一類可跟蹤對象都有對應的管理器進行管理,因此,我們不應該直接嘗試去銷燬(Destroy)可跟蹤對象,其實如果強行使用Destroy銷燬可跟蹤對象可能會導致應用出錯。對於那些可以手動添加和刪除的可跟蹤對象,相應的管理器也提供了刪除的方法,例如移除一個參考點,我們只需要調用ARReferencePointManager.RemoveReferencePoint()方法即可。

  同時,添加一個可跟蹤對象ARFoundation需要做一系列的準備工作,因此,在我們添加一個可跟蹤對象後,它並不會馬上就被系統所跟蹤,直到系統準備完畢並報告可跟蹤對象已經添加到ARFoundation系統中,這個過程和時間因可跟蹤對象類型而異。爲明確可跟蹤對象狀態,所有的可跳躍對象都有一個pending屬性,pending屬性標識該可跟蹤對象已經被添加但還沒有真正添加到ARFounddation跟蹤系統中,檢測這個屬性可獲取到該可跟蹤對象的跟蹤情況。

var referencePoint = referencePointManager.AddReferencePoint(new Pose(position, rotation));
Debug.Log(referencePoint.pending); // "true"

// -- 當前幀中該方法不會觸發--
void OnReferencePointsChanged(ARReferencePointsChangedEventArgs eventArgs)
{
    foreach (var referencePoint in eventArgs.added)
    {
        // 正在跟蹤的對象
    }
}

  在上述代碼中,在添加一個ReferencePoint後馬上檢查其狀態,referencePoint.pending爲true,意味着該可跟蹤對象還未下真正添加到ARFounddation跟蹤系統中,因此該管理器的OnReferencePointsChanged事件不會被觸發,直到真正添加成功(可以要在第二幀或者第三幀才能觸發)。

  遍歷可跟蹤對象可以通過相應的管理器進行,如以下代碼所示:

var planeManager = GetComponent<ARPlaneManager>();
foreach (ARPlane plane in planeManager.trackables)
{
    // 獲取到所有正在跟蹤的ARPlane
}

  如上代碼所示,管理器的trackables屬性返回一個TrackableCollection集合,利用這個集合,我們可以使用foreach循環進行遍歷。另外,我們還可以使用TryGetTrackable()方法去獲取特定的可跟蹤對象。

  有時我們可能會禁用正在跟蹤的對象的行爲,但又不是完全禁用管理器對可跟蹤對象的管理,例如我們可能不想渲染已被檢測到的平面,但又不是禁用平面檢測功能。那麼這時我們可以通過遍歷對特定或者全部的正在跟蹤的對象進行處理即可,如下代碼所示。

var planeManager = GetComponent<ARPlaneManager>();
foreach (var plane in planeManager.trackables)
{
    plane.gameObject.SetActive(false);
}

  在上面代碼中,我們將所有檢測到的平面禁用。

  可跟蹤對象管理器檢測到一個可跟蹤對象後將會實例化一個該對象的prefab,這個prefab必須要有該類可跟蹤對象的對應組件。如果沒有提供這個prefab,管理器將創建一個空的掛載該類可跟蹤對象組件的對象,如果提供的prefab沒有掛載該類可跟蹤對象的對應組件,管理器將爲其添加一個。例如Plane Mnager檢測到一個平面,如果Plane Prefab屬性有賦值它將用這個prefab實例化爲一個對象,如果提供的prefab沒有ARPlane組件,將自動爲其掛載一個,如果Plane Prefab屬性沒有指定,Plane Mnager將創建一個只有ARPlane組件的空對象。

參考文獻

Trackable Managers Trackable Managers

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章