版權聲明:Davidwang原創文章,嚴禁用於任何商業途徑,授權後方可轉載。
AR 是對現實環境的增強,運動跟蹤可以解決用戶在現實環境中自己在哪裏的問題,但運動跟蹤本身並不能解決用戶周邊環境是什麼的問題,運動跟蹤不能識別出平面,也不能識別出物體,但 AR 應用必須要能理 解其本身所處的環境,這樣才能爲用戶帶來沉浸感和真實感,特別是如果要多人共享同一個體驗,那 AR 應用必須要能識別和融合多用戶環境。
(一)點雲
特徵點是指 ARFoundation 通過 VIO 檢測捕獲的攝像頭圖像中的視覺差異點,這些視覺差異點是從圖像中明暗、顏色、灰度差異比較大的點中挑選出來的,ARFoundation 會實時更新這些特徵點。在時間的推移中, 一部分特徵點會被刪除,同時也會不斷的加入新的特徵點,通過算法能獲取到比較穩定的特徵點,這些穩定的特徵點在機器視覺中就可以被解析成特定的位置信息,通過特徵點隨時間的變化即可計算出其位置變 化情況。檢測到的特徵點信息與設備 IMU 的慣性測量結果結合,不僅可以跟蹤到用戶(手機設備)隨着 時間推移而相對於周圍世界的姿態。不僅如此,ARFoundation 也通過特徵點來檢測平面的,在前節平面管理文章裏,AR Plane組件有個屬性 Vertex Changed Threshold,這個屬性設置就是用來判斷特徵點是否屬於同一平面的閥值。在下圖中,花瓶周邊的小點即爲特徵點。
衆多的特徵點即可構成特徵點雲,簡稱點雲。點雲可以在幀與幀之間發生變化,在一些平臺上,只生成一個點雲,而另一些平臺則將其特徵點組織到不同空間區域的不同點雲中。
在ARFoundation中,通常認爲單個特徵點是不可被跟蹤的,而點雲則是可跟蹤的,但是,特徵點可以在幀與幀之間被識別,因爲它們具有唯一的標識符。
每一個特徵點都有Vector3類型的位置信息(positions)以及ulong類型的id(identifiers)和float類型的置信值(confidence Value)。特徵點的位置信息是在Session空間中的座標值,可以通過ARPointCloud.position來獲取。每一個特徵點都有一個獨一無二的id標識符,可以通過ARPointCloud.identifiers來獲取,其在Unity中的類型爲ulong,但具體在各平臺的類型與平臺相磁。置信值表示ARFoundation對每個特徵點的信心程度,範圍爲(0,1),值越大表示對這個特徵點越確信。
與平面類似,點雲由ARPointCloudManager組件負責管理,該組件負責點雲的創建,特徵點的創建、更新、移除,特徵點的檢測啓用關閉、特徵的顯示隱藏與平面處理方式完全一致。點雲數據可以輔助平面檢測,更重要的是點雲數據是環境重建的基礎。隨着時間的延長,點雲數據中的特徵點會迅速增長,爲了防止特徵點過多而影響性能,點雲中的總特徵點必須要控制在一定的數值範圍內,ARCore將特徵點的最大數限制在61440個。
新建一個工程,在Hierarchy窗口空白處點擊鼠標右鍵,依次選擇XR->AR Default Point Cloud新建一個點雲對象,如下圖所示。
將AR Default Point Cloud對象從Hierarchy窗口中拖動到Project窗口中的Prefabs文件夾下製作成一個Prefab,在Hierarchy中選擇AR Session Origin對象,然後在其Inspector窗口中爲其添加AR Point Cloud Manager組件,並將剛纔製作好的AR Default Point Cloud預製體賦給AR Point Cloud Manager組件下的Point Cloud Prefab屬性,最後刪除Hierarchy窗口中的AR Default Point Cloud對象,如下圖所示 。
編譯運行,效果如下圖所示。
(二)參考點
ARFoundation中的參考點(Reference Point)與ARCore中的Anchor其實是同一概念,錨點的原意是指不讓船舶飄移的固定錨,這裏用來指將虛擬物體固定在 AR 空間上的一種技 術。由於跟蹤使用的陀螺儀傳感器的特性,誤差會隨着時間積累,所以需要通過圖像檢測等來對誤差進行 修正,此時,如果已存在於空間上的對象不同步進行校正則會出現偏差,錨點的功能即是綁定虛擬物體與 AR 空間位置。被賦予 Anchor 的對象將被視爲固定在空間上的特定位置,並自動進行位置校正,錨點可以 確保物體在空間中看起來保持相同的位置和方向,讓虛擬物體在 AR 場景中看起來待在原地不動。
參考點的工作原理如下:AR 應用中,攝像頭和虛擬物體在現實世界空間中的位置會在幀與幀之間更新,即虛擬物體在現實世界 空間中的姿態每幀都會更新,由於陀螺儀傳感器的誤差積累,虛擬物體會出現飄移現象,爲解決這個問題, 我們需要使用一個參考點將虛擬對象固定在現實空間中,如前所述,這個參考點姿態信息的偏差必須要能用某種方式消除以確保參考點的姿態不會隨着時間而發生變化。消除這個偏差的就是視覺校準技術,通過視覺校 準能讓參考點保持相同的位置與方向,這樣,連接到該參考點的虛擬對象也就不會出現飄移。一個參考點上可以 連接一個或多個虛擬對象,參考點和連接到它上面的物體看起來會待在它們在現實世界中的放置位置,隨着參考點姿態在每幀中進行調整以適應現實世界空間更新,參考點也將相應地更新物體的姿態,確保這些物體能 夠保持它們的相對位置和方向,即使在參考點姿態調整的情況下也能如此,有了參考點,連接到參考點上的虛擬 對象就像是固定在現實世界空間中一樣。
參考點的是一種對資源消耗比較大的可跟蹤對象,因此需要謹慎使用並在不需要的時候分離參考點。
在前文例子中,我們在平面上放置虛擬對象並沒有使用參考點,也未見官方對參考點使用給出指導意見,結合我自己的經驗,在以下情況下有必要使用參考點:
- 保持兩個或多個虛擬對象的相對位置。在這種情況下,我們可以將兩個或多個虛擬物體掛載在同一個參考點下,這樣,參考點會使用相同的矩陣更新掛載在其下的虛擬對象,因此可以保持它們之間的位置關係不受其他因素影響。
- 保證虛擬物體的獨立性。在前文中,我們在平面上放置了虛擬物體,在放置虛擬物體時我們使用的是射線檢測的方式將虛擬物體掛在了平面上,通常情況下這沒有問題,但如果後來因爲某種原因AR Plane Manager被禁用、平面被銷燬或者被隱藏,那就會影響到以平面爲參考的虛擬物體位置的穩定性,導致虛擬物體漂移。在這種情況下,如果我們使用了參考點,將虛擬物體掛載在參考點下就能保持虛擬物體的獨立性,不會受到平面狀態的影響。
- 提高跟蹤穩定性。使用參考點即是通知跟蹤系統需要獨立跟蹤該點從而提高掛載在該參考點上虛擬物體的穩定性。
- 保持跟蹤對象與平面的相對位置穩定。使用AttachReferencePoint()方法可以將一個參考點與平面綁定起來,從而保持掛載在參考點下的虛擬物體與平面保持關係一致。如在一個垂直平面上使用AttachReferencePoint()方法建立一個參考點,在參考點更新時就會鎖定x,z分量值,從而保持參考點與平面位置關係始終一致。
在ARFoundation中,AR Reference Point Manager提供瞭如下方法管理參考點:
方法 | 描述 |
---|---|
AddReferencePoint(Pose) | 用給定的Pose添加一個參考點,Pose爲世界空間中的姿態,返回一個新的ARReferencePoint。 |
AttachReferencePoint(ARPlane, Pose) | 用給定的Pose創建一個相對於已檢測到平面的ARReferencePoint,其中ARPlane是一個已檢測到的平面,Pose爲世界空間中的姿態。 |
RemoveReferencePoint(ARReferencePoint) | 移除一個ARReferencePoint,如果移除成功則返回True,如果返回False通常意味着這個ARReferencePoint已經不在跟蹤狀態。 |
referencePointsChanged | 在ARReferencePoint發生變化是觸發的事件,如一個新的ARReferencePoint創建、對一個現存的ARReferencePoint進行更新、移除一個ARReferencePoint。 |
AddReferencePoint(Pose)方法與AttachReferencePoint(ARPlane, Pose)方法的區別在於,AddReferencePoint(Pose)是創建一個參考點,並要求跟蹤系統跟蹤空間中的這個特定位置,如果Session發生變化時它可能會更新;AttachReferencePoint(ARPlane, Pose)方法是將一個參考點“附加”到一個平面上時,該參考點會保持與平面的相對距離。例如,如果平面是水平的,則參考點僅在平面的Y位置更改時上下移動,其他情況下Y值不應發生變化,這對於在平面上或平面附近“粘貼”虛擬對象很有用。
在添加ARReferencePoint時需要注意的是,添加一個ARReferencePoint需要一到兩幀的時間,在添加後ARReferencePoint到添加成功之前,添加的ARReferencePoint處於“pending”狀態,這個“pending”狀態值可以通過ARReferencePoint.pending屬性進行查詢。同樣的,移除一個ARReferencePoint也需要一到兩幀的時間,如果嘗試去移除一個還沒有添加成功的ARReferencePoint,不會有任何效果。同時,一定不要手動使用Destroy()方法去銷燬ARReferencePoint,這可能會引發錯誤,如前所述,ARReferencePoint也由ARReferencePointManager負責管理,所以務必要使用RemoveReferencePoint(ARReferencePoint)方法去移除ARReferencePoint。
使用參考點的注意事項:
1、儘可能複用參考點。在大多數情況下,應當讓多個相互靠近的物體使用同一個參考點,而不是爲每個物 體創建一個新參考點。如果物體需要保持與現實世界空間中的某個可跟蹤對象或位置之間獨特的空間關係, 則需要爲對象創建新參考點。因爲參考點將獨立調整姿態以響應 ARFoundation 在每一幀中對現實世界空間的估算,如 果場景中的每個物體都有自己的參考點,則會帶來很大的性能開銷。另外,獨立錨定的虛擬對象可以相對彼 此平移或旋轉,從而破壞虛擬物體的相對位置應保持不變的 AR 場景體驗。
例如,假設 AR 應用可以讓用戶在房間內佈置虛擬傢俱。當用戶打開應用時,ARFoundation 會以平面形式開 始跟蹤房間中的桌面和地板。用戶在桌面上放置一盞虛擬檯燈,然後在地板上放置一把虛擬椅子,在此情 況下,應將一個參考點連接到桌面平面,將另一個參考點連接到地板平面。如果用戶向桌面添加另一盞虛擬臺 燈,此時我們可以重用已經連接到桌面平面的參考點。這樣,兩個檯燈看起來都粘在桌面平面上,並保持它 們之間的相對位置,椅子也會保持它相對於地板平面的位置。
2、保持物體靠近參考點。錨定物體時,最好讓需要連接的虛擬對象儘量靠近參考點,避免將物體放置在離 參考點幾米遠的地方,以免由於ARFoundation 更新現實世界空間座標而產生意外的旋轉運動。如果確實需要將物體 放置在離現有參考點幾米遠的地方,應該創建一個更靠近此位置的新參考點,並將物體連接到新參考點。
3、分離未使用的參考點。爲提升應用的性能,通常需要將不再使用的參考點分離。因爲對於每個可跟蹤對 象都會產生一定的 CPU 開銷,ARFoundation 不會釋放具有連接參考點的可跟蹤對象,從而造成無謂的性能損失。