Unity MARS的出現是為了幫助創作者們製作可適應環境的AR內容,我們希望解決AR開發者們面臨的幾個主要問題:如何精確地在現實中描繪內容、如何加快AR創作在各個環境下的迭代與測試時間()以及如何讓虛擬內容適應不同的環境。以上幾點都是與內容適應性相關的問題。
Queries(查詢)是MARS解決內容適應性的一種手段。對於每一個(或一組)虛擬內容,在擺放進現實環境時,MARS都會發起一次單獨的query(查詢)指令——請求描述現實世界的、帶語義標籤的數據。Query由兩種大部分組成:
一個或多個確定數據是否匹配查詢指令的條件
一個或多個確定條件匹配後需要發生的行為
每個查詢指令或由代理髮起、或由代理組發起,代表了虛擬內容與現實世界之間的連接。
數據實體
Unity MARS資料庫中的每一條數據都代表了用戶周圍環境中的一個部分,這些部分有各種形式,最為常見的有對象表面、人臉和圖像標記。
Unity MARS資料庫:
https://docs.unity3d.com/Packages/com.unity.mars@1.1/manual/MARSConcepts.html#the-mars-database
每條數據都以稱為數據ID(data ID)的一串數字做區分,每條數據又能包含任意數量的特徵(traits),即帶名稱的特定數據類型。整個模型與實體組件系統(ECS)的概念相似,特徵相當於一個組件。
數據使用
每個代理都帶有稱作Exclusivity(排他性)的屬性,確定了代理使用匹配數據的方式,並限制了查詢指令訪問已經在使用的數據,確保每一條內容能匹配上相應的現實數據。
Reserved(保留)表明代理可訪問的數據受限——數據不能由Shared(共享)或Reserved(保留)代理使用,在匹配之後,數據只能以只讀的方式被其他代理使用。
Shared(共享)則表明代理不排他地使用數據——其他的Shared(共享)代理也可使用數據,代理在匹配之後可繼續使用數據。
Read Only(只讀)表明可訪問的任意數據, 因為只讀本身就屬性聲明了代理不會「使用」匹配選項。
在查詢指令匹配之後,所有匹配範圍內的代理都會被標記為「正在使用」某條數據,使用方式則由以上屬性確定。
條件
每個條件(Condition)都包含了特定數據的一個特徵,是確定匹配與否的評判標準。而在編寫條件時,根據位置或尺寸這類特徵數據來編寫要比根據表面或人臉這類可追蹤數據來編寫更好,因為同樣的條件可重複使用在具備相同特徵的數據上。
我們以一個平面尺寸(Plane Size)條件為例。
平面尺寸條件:
https://docs.unity3d.com/Packages/com.unity.mars@1.1/manual/GettingStarted.html?_ga=2.160589439.39231630.1610343422-769532729.1591089650#adding-a-plane-size-condition
條件需要包含一個「bounds2d(2d邊界)」特徵,來描述一塊可接受的二維邊框,好讓代理能搜尋到特定數據片段,特徵的數據類型為Vector2——即由兩個浮點數組成。該條件可用於檢測任何標記為「平面」、帶「bounds2d」特徵的數據,也適用於識別圖像標識。
首先,MARS會去找帶有bounds2d特徵的數據,排除不符合最小與最大尺寸的那些。
剩下符合特定邊框的數據會被打分——分數用來描述數據的匹配程度,範圍為0到1,0代表不匹配、1代表完美匹配。分數可以看作「匹配程度值」。而在平面尺寸條件中,邊框值靠近範圍中心的得分更高,靠近邊界的得分較低。
如果某個代理有多個條件,數據要匹配就必須滿足所有的條件。並且每個條件的評分都會被綜合考慮,以測量代理與給定數據的匹配程度。
比如,如果我們要添加一個Alignment(對齊)條件,規定代理測量的某個表面必須為水平、方向必須為向前,則該表面不僅要滿足前一個平面尺寸條件,還必須滿足對齊條件。
系統會在考慮進所有條件後,計算出符合條件、評分最高的匹配數據。
群組與關係
包含於同個群組的代理必須同時匹配所有不同的數據,而不同代理之間存在有一定的關係(Relation)。
例如,水平高度(Elevation)關係描述了現實中水平高度可接受的差異範圍——在Unity中,水平高度是指Y軸上的距離;而這裡,一個匹配大平面的代理與一個小平面代理之間的距離就是兩者間的水平高度關係。
關係的作用與條件類似,只不過它還會看雙方的關係條件是否也滿足。
水平高度關係會檢測「姿態(Pose)」特徵來查找匹配選項的空間位置,確定相互之間是否處於可接受範圍內,然後為每個關係打評0到1的分數。與平面尺寸條件類似,接近範圍中間值的數據要更加理想。
為了檢測每種關係在整個群組中的匹配狀況,組內所有所有的關係評分會被綜合考慮,每個群組的評分取平均值,與代理的條件相同。
行為
行為是指MARS在尋得匹配數據後所採取的操作。其與條件類似,以特徵數據作為觸發依據,但可以設定多個觸發所需的特徵數據。
每個代理默認都帶有一個最簡單的行為,即設定姿態(Set Pose)行為。該行為類型為姿態(Pose)的pose特徵為依據——即在空間中的位置與朝向。行為可用於排除不帶姿態特徵的數據。
在查詢到匹配對象後,Set Pose行為會接收對象的姿態參數,將虛擬內容放置到該位置上,匹配的查詢結果就會正確放置到環境中了()。
優先級與衝突的解決
我們可以為代理或代理組設定優先級,告訴系統高優先級的內容要比其他內容更為重要。共有五種優先級,從最低到最高,優先級默認為普通。
在「解決衝突」階段,系統需要確定哪一個對象擁有優先訪問匹配數據的權力,而優先級就是首個評判因素。如果有多個代理將同一個數據ID視作最佳匹配數據,則MARS會查找擁有最高優先級的代理,將數據指定給它。如果優先級相同,則數據會被指定給評分最高的代理。
群組圖表
即使在一個簡單的代理組中,匹配過程也可能變得十分複雜。一個有效的流程分析方式是建立圖表。
下方圖例中,代理組含有水平高度與距離關係。每一點代表了一個代理,每個箭頭代表了兩者之間的關係。
群組匹配的問題用技術術語可表達為子圖同構搜索(subgraph isomorphism search)。系統並不僅僅會查找子圖表的匹配對象,而會在下方大圖表(又稱「搜索空間(search space)」)中查找最為匹配(評分最高)的實例。該大圖表則由搜尋而得的有效關係實例集合中派生而來。
上方包含了所有要考慮的因素,而下方則為拆分出的特定關係。每個點代表了一個數據實體,而每個箭頭代表了兩個數據實體間距離或水平高度關係的一個有效實例。
群組中更多的關係或組成部分會給匹配子圖加入更多考慮因素,圖表也就更加複雜。
複雜情況的處理
在為代理組找出數值最匹配的數據時,若組成員或數據集大小增加,則問題複雜度也會呈爆發式增長。而大型場景中的多個單獨代理在查詢時會被看作一個整體,所以複雜度的增長並不會那麼誇張。
為了保證系統在複雜的查詢指令下能繼續運行、避免應用故障,系統會執行三種操作。
首先,查詢請求的處理會被分成幾個階段,每一階段處理一小部分任務,整個任務會在較長時間段中鋪展開來。
其次,系統會採取一種取近似策略,特別複雜的群組查詢其返回的結果將是可接受計算量之內所能求得的最佳答案。
最後,系統會優先處理最為複雜、優先級最高的查詢請求,最大化求得高質量結果的可能。在同一次評估中,更複雜的查詢請求對匹配結果的影響要比其他請求更大。
https://unity.cn/product/mars
點擊關鍵詞
獲取更多信息
Unity 技術精講:
[1]
[2]
[3]
[4]
[5]
Unity 官方微信
第一時間了解Unity引擎動向,學習最新開發技巧
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.