空間對應

空間對應提供 HoloLens 環境中真實世界表面的詳細標記法,讓開發人員能夠建立令人信服的混合實境體驗。 藉由將真實世界與虛擬世界合併,應用程式可能會讓全像投影看起來很真實。 應用程式也可以藉由提供熟悉的實際行為和互動,更自然地配合使用者的期望。


裝置支援

功能 HoloLens (第 1 代) HoloLens 2 沉浸式頭戴裝置
空間對應 ✔️ ✔️

為什麼空間對應很重要?

空間對應可以讓使用者將物件放置在實際的表面上。 這有助於錨定使用者世界中的物件,並利用真實世界深度提示。根據其他全像投影和真實世界物件來遮蔽全像投影,可協助使用者相信這些全像投影實際上在其空間中。 全像投影會在空間中浮動,或與使用者一起移動,不會像真實一樣。 可能的話,請放置專案以方便使用。

放置或移動全像投影時視覺化表面, (使用投影格線) 。 這可協助使用者知道他們最能放置全像投影的位置,並顯示他們嘗試放置全像投影的位置是否未對應。 如果使用者最後有太多角度,則可以對使用者「帳單板專案」。

概念概觀

涵蓋會議室的網格表面
涵蓋會議室的空間對應網格範例

用於空間對應的兩個主要物件類型是「空間 Surface 觀察者」和「空間 Surface」。

應用程式會為 Spatial Surface Observer 提供一或多個周框磁片區,以定義應用程式想要接收空間對應資料的空間區域。 針對這其中每一個磁片區,空間對應會提供一組空間表面的應用程式。

根據真實世界) ,這些磁片區可能是固定位置的固定 (,或者這些磁片區可能會附加至 HoloLens (移動,但不會隨著 HoloLens 在環境) 移動時旋轉。 每個空間表面都會描述小型空間中的真實世界表面,以連結至世界鎖定 空間座標系統的三角形網格表示。

當 HoloLens 收集有關環境的新資料,以及發生環境變更時,空間表面會出現、消失和變更。

空間感知設計概念示範

如果您想要查看作用中的空間感知設計概念,請參閱下面的 設計全像投影 - 空間感知 影片示範。 當您完成時,請繼續進行以取得更詳細的特定主題深入探討。

這段影片取自「設計全像投影」HoloLens 2應用程式。 在這裡下載並享受完整的體驗。

空間對應與 Scene Understanding WorldMesh

針對HoloLens 2,您可以使用Scene understanding SDK (EnableWorldMesh 設定) 來查詢靜態版的空間對應資料。 以下是存取空間對應資料的兩種方式之間的差異:

  • 空間對應 API:
    • 有限範圍:使用者周圍有有限大小快取「泡泡」的應用程式可用的空間對應資料。
    • 透過 SurfacesChanged 事件提供已變更網格區域的低延遲更新。
    • 每立方三角形計量參數所控制之詳細資料的可變層級。
  • 場景瞭解 SDK:
    • 無限制的範圍 - 提供查詢半徑內的所有掃描空間對應資料。
    • 提供空間對應資料的靜態快照集。 取得更新的空間對應資料需要針對整個網格執行新的查詢。
    • 由 RequestedMeshLevelOfDetail 設定所控制的詳細資料一致層級。

哪些因素會影響空間對應品質?

這裡詳述數個因素可能會影響這些錯誤的頻率和嚴重性。 不過,您應該設計應用程式,讓使用者即使在空間對應資料中有錯誤時,也能達成其目標。

常見使用案例

常見空間對應使用案例的圖例:放置、遮蔽、物理和導覽

放置

空間對應可讓應用程式有機會向使用者呈現自然且熟悉的互動形式;比在桌面上放置手機更自然?

通过只允许全息图(更概括地说,是任何选定的空间位置)放置在表面上,提供了从 3D(空间中的点)到 2D(表面上的点)的自然映射。 這可減少使用者提供給應用程式所需的資訊量,並讓使用者的互動更快速、更容易且更精確。 這是因為「距離遠」不是我們用來實際與其他人或電腦通訊的內容。 當我們以手指指向時,我們會指定方向,但不是距離。

以下是一個重要注意事項,例如,當應用程式透過沿著使用者的注視方向執行光線廣播來尋找最接近的空間表面) ,這必須產生使用者能夠可靠地預測的結果時,與方向 (的距離。 否則,使用者將會失去其控制感,這很快就會變得令人感到令人感到沮喪。 有一個可協助解決此問題的方法,就是執行多個光線廣播,而不只是一個。 匯總結果應該較平滑且更容易預測,較不容易受到暫時性「極端值」結果的影響 (,因為光線會通過小型漏洞或點擊使用者不知道) 的小型幾何。 匯總或平滑處理也可以隨著時間執行;例如,您可以限制全像投影與使用者距離的最大速度。 只要限制最小和最大距離值也可以有所説明,因此移動的全像投影不會突然飛出到距離或損毀回到使用者的臉部。

應用程式也可以使用表面的形狀和方向來引導全像投影放置。 全像攝影式椅子不應該通過牆,而且應該與樓層排清,即使它稍微不平均也一樣。 這種功能可能會依賴物理碰撞的使用,而不是光線傳播,不過同樣地,也會套用類似的考慮。 如果放置的全像投影有許多小型多邊形,就像在椅子上一樣,將這些多邊形的物理表示擴充到更寬且更平滑,這樣它們就能夠更順暢地滑動到空間表面,而不需要延遲。

在極端情況下,使用者輸入可以完全簡化,而空間表面可用來執行完全自動全像投影放置。 例如,應用程式可以在牆上放置全像攝影光線開關,讓使用者按下。 此處對可預測性的相同注意事項會再加倍地套用;如果使用者預期可控制全像投影位置,但應用程式不一定會將全像投影放在預期 (如果光線開關出現在使用者無法觸達) 的地方,則這會是令人沮喪的體驗。 實際上,執行需要使用者修正一些時間的自動放置會更糟,而不只是要求使用者一律自行放置;因為 預期自動放置成功,所以手動更正感覺就像負擔一樣!

另請注意,應用程式使用空間表面放置的能力,高度取決於應用程式的 掃描體驗。 如果尚未掃描表面,則無法用於放置。 應用程式可以讓使用者清楚瞭解,以便協助掃描新的表面或選取新的位置。

在放置期間,對使用者的視覺意見反應非常重要。 使用者必須知道全像投影以最接近的表面為基礎,且具有 地面效果。 例如,他們應該瞭解其全像投影的移動為何受到限制 (,因為與另一個附近的表面發生衝突) 。 如果它們無法將全像投影放在目前的位置,則視覺化回饋應該清楚說明原因。 例如,如果使用者嘗試將全像攝影 Couch 卡在半形到牆,則牆後方的部分應該會以一種淺色來脈衝。 或者,如果應用程式在使用者可以看到真實世界表面的位置找不到空間表面,則應用程式應該會清楚顯示。 在此區域中明顯缺少基礎效果可能會達到此目的。

遮蔽

空間對應表面的主要用途之一,就是遮蔽全像投影。 這種簡單行為對全像投影的認知實境有很大的影響,有助於建立真正能與使用者相同的實體空間的可見感。

遮蔽也會為使用者提供資訊;當全像投影似乎被真實世界表面遮蔽時,這會提供額外的視覺回饋給世界內該全像投影的空間位置。 相反地,遮蔽也可以實用地 隱藏 使用者的資訊;遮蔽牆後方的全像投影,可以直覺的方式減少視覺雜亂。 若要隱藏或顯示全像投影,使用者只需要移動其頭部。

遮蔽也可以用來根據熟悉的實體互動,對自然使用者介面的預期;如果全像投影被表面遮蔽,這是因為該表面為實心,因此使用者應該預期全像投影會與該表面 碰撞 ,而不會通過它。

有時候,不想要全像投影的遮蔽。 如果使用者需要與全像投影互動,則他們必須看到它,即使它位於真實世界表面後面也一樣。 在這種情況下,藉由減少其亮度) ,在遮蔽 (時,通常會以不同的方式轉譯這類全像投影。 如此一來,使用者可以以視覺化方式找出全像投影,但他們仍會知道它位於某個專案後方。

物理特性

使用物理模擬是另一種方式,其中空間對應可用來強化使用者實體空間中全像投影 的存在 。 當我的全像攝影球實際從我的桌上擲回、跳到樓層並消失在桌上時,我可能很難相信它不存在。

物理模擬也讓應用程式有機會使用自然且熟悉的物理型互動。 如果在樓層四處移動一段全像攝影式裝飾,如果使用者在地板上滑動適當的慣性與摩擦,就可能比較容易。

若要產生實際的實體行為,您可能需要執行一些 網格處理 ,例如填滿孔、移除浮動全像和平滑粗略表面。

您也必須考慮應用程式 掃描體驗 如何影響其物理模擬。 首先,遺漏的介面不會與任何專案衝突;當橡皮球向下跳動及離開已知世界結尾時,會發生什麼事? 其次,您必須決定是否要持續回應一段時間的環境中變更。 在某些情況下,您會想要儘快回應;假設使用者是否使用門和門做為可移動的門道,以防禦傳入羅馬箭號的暫存。 不過,在其他情況下,您可能想要忽略新的更新;如果您的狗決定在曲目中間停留在賽車軌周圍,駕駛全像攝影運動車可能會突然不有趣。

應用程式可以使用空間對應資料來授與全像攝影字元 (或代理程式,) 以真實人相同的方式流覽真實世界的能力。 這可協助強化全像攝影字元的存在,方法是將全像字元限制為與使用者及其朋友相同的自然熟悉行為集。

流覽功能也適用于使用者。 一旦導覽地圖建置在指定的區域中,就可以共用,為不熟悉該位置的新使用者提供全像攝影方向。 此地圖的設計目的是為了協助讓交通「交通」順暢地流動,或避免在建築月臺等危險位置發生意外。

實作導覽功能的重要技術挑戰是可靠偵測可流覽表面, (人類不會流覽資料表!) 且正常調整環境變更, (人類不會通過封閉門!) 。 網格可能需要一些 處理 ,才能供虛擬字元使用路徑規劃和流覽。 將網格平滑並移除通覺有助於避免字元卡住。 您也可以大幅簡化網格,以加速字元的路徑規劃和流覽計算。 這些挑戰在開發視訊遊戲技術方面收到大量的注意,而且這些主題有許多可用的研究論文。

Unity 中的內建 NavMesh 功能預設無法用於空間對應表面,因為直到應用程式啟動時,才會知道介面。 不過, 您可以 安裝 NavMeshComponents,在執行時間期間建置 NavMesh。 請注意,空間對應系統不會提供離使用者目前位置 遠的介面相關資訊 ;若要建置大型區域的地圖,應用程式必須「記住」表面。 您也可以在空間感知設定檔中增加 觀察範圍 設定,這會增加您可以建置 NavMesh 的區域。

視覺效果

大部分時間都適合空間表面不可見;將視覺雜亂降至最低,讓真實世界自行說話。 不過,有時候,即使顯示空間對應介面的實際對應專案,仍可直接視覺化空間對應表面。

例如,當使用者嘗試將全像投影放在表面 (將全像攝影封包放在牆上時,假設) 將陰影投射到表面來「地面」全像投影會很有用。 這可讓使用者更清楚瞭解全像投影與表面之間的確切實體鄰近性。 這也是在使用者認可變更之前,以視覺化方式「預覽」變更的較一般作法範例。

藉由視覺化介面,應用程式可以與使用者共用其環境瞭解。 例如,全像攝影板遊戲可以將它識別為「資料表」的水準表面視覺化,讓使用者知道他們應該在何處互動。

視覺化表面是顯示使用者從檢視隱藏的鄰近空間的實用方式。 這可以提供一種方式,讓使用者存取其廚房 (,以及其所有包含的全像投影,) 來自其會議室。

空間對應所提供的表面網格可能不是特別「乾淨」。 請務必適當地將其視覺化。 傳統的光源計算可能會以視覺方式反白顯示表面常態中的錯誤,而投影到表面的「乾淨」紋理可能會協助提供更簡潔的外觀。 在轉譯表面之前,也可以進行 網格處理 來改善網格屬性。

注意

HoloLens 2實作新的Scene Understanding 運行時間,為Mixed Reality開發人員提供結構化的高階環境標記法,其設計目的是簡化放置、遮蔽、物理和流覽的實作。

使用 Surface 觀察者

空間對應的起點是表面觀察者。 程式流程如下所示:

  • 建立表面觀察者物件
    • 提供一或多個空間磁片區,以定義應用程式想要接收空間對應資料感興趣的區域。 空間磁片區只是定義空間區域的形狀,例如球體或方塊。
    • 使用具有世界鎖定空間座標系統的空間磁片區來識別實體世界固定區域。
    • 使用空間磁片區,以主體鎖定的空間座標系統更新每個框架,以識別移動 (但不會與使用者旋轉) 的空間區域。
    • 這些空間磁片區可以隨時變更,因為應用程式的狀態或使用者變更。
  • 使用輪詢或通知來擷取空間表面的相關資訊
    • 您可以隨時「輪詢」表面觀察者的空間表面狀態。 相反地,您可以註冊表面觀察者的「表面已變更」事件,這會在空間表面變更時通知應用程式。
    • 針對動態空間磁片區,例如檢視 frustum 或主體鎖定的磁片區,應用程式必須藉由設定感興趣的區域,然後取得目前的空間表面集來輪詢每個畫面的變更。
    • 若是靜態磁片區,例如涵蓋單一房間的已鎖定世界 Cube,應用程式可能會註冊「表面已變更」事件,以在磁片區內的空間表面可能已變更時收到通知。
  • 進程介面變更
    • 逐一查看提供的一組空間表面。
    • 將空間表面分類為新增、變更或移除。
    • 針對每個新增或變更的空間表面,如果適當地提交非同步要求,以接收更新的網格,代表表面在所需的詳細資料層級的目前狀態。
  • 在下列各節) 處理非同步網格要求 (更多詳細資料。

網格快取

空間表面以密集三角形網格表示。 儲存、轉譯和處理這些網格可能會耗用大量的計算和儲存資源。 因此,每個應用程式都應該採用適合其需求的網格快取配置,以將用於網格處理和儲存體的資源降到最低。 此配置應該決定要保留的網格以及要捨棄的網格,以及何時更新每個空間表面的網格。

許多討論的考慮都會直接通知您的應用程式應該如何接近網格快取。 您應該考慮使用者如何流覽環境、需要哪些表面、觀察不同的表面,以及應該擷取環境中的變更。

解譯表面觀察者所提供的「表面已變更」事件時,基本網格快取邏輯如下所示:

  • 如果應用程式看到之前未看到的空間表面識別碼,它應該會將它視為新的空間介面。
  • 如果應用程式看到具有已知識別碼但具有新更新時間的空間表面,則應該將此視為更新的空間表面。
  • 如果應用程式不再看到具有已知識別碼的空間表面,它應該會將它視為已移除的空間表面。

每個應用程式最多可以進行下列選擇:

  • 對於新的空間表面,應該要求網格嗎?
    • 一般而言,應該立即要求新的空間表面網格,這可能會為使用者提供有用的新資訊。
    • 不過,在使用者前面和附近的新空間表面應該優先獲得優先順序,而且應該先要求其網格。
    • 如果不需要新的網格,例如,如果應用程式已永久或暫時「凍結」其環境模型,則不應該要求它。
  • 如需更新的空間表面,應該要求網格嗎?
    • 在使用者前面和附近更新的空間表面應該優先提供優先順序,而且應該先要求其網格。
    • 它也可能適合將優先順序高於更新表面的新表面,特別是在掃描體驗期間。
    • 為了限制處理成本,應用程式可能會想要節流處理空間表面更新的速率。
    • 可能推斷空間表面的變更是次要的,例如,如果表面的界限很小,在此情況下,更新可能不夠重要。
    • 更新使用者目前感興趣的區域外部的空間表面可能會完全忽略,但在此情況下,修改表面觀察者使用的空間周框磁片區可能會更有效率。
  • 對於移除的空間表面,應該捨棄網格嗎?
    • 一般而言,應該立即捨棄網格以供移除的空間表面使用,讓全像投影遮蔽保持正確。
    • 不過,如果應用程式有理由認為空間表面會根據使用者體驗) 的設計快速重新出現 (,則保留空間表面可能會比捨棄其網格更有效率,稍後再重新建立。
    • 如果應用程式正在建置使用者環境的大規模模型,則完全不想要捨棄任何網格。 不過,在空間表面消失時,它仍然需要限制資源使用量,可能是將網格多工緩衝處理至磁片。
    • 在空間表面產生期間,某些相對罕見的事件可能會導致空間表面被類似位置的新空間表面取代,但有不同的識別碼。 因此,選擇不要捨棄已移除表面的應用程式應該小心不要最後有多個高度重迭的空間表面網格涵蓋相同位置。
  • 是否應該捨棄任何其他空間表面的網格?
    • 即使空間表面存在,如果它不再適用于使用者體驗,則應該捨棄它。 例如,如果應用程式將門道另一邊的會議室「取代」為替代的虛擬空間,則該會議室中的空間表面不再重要。

以下是使用空間和時態性連字號的網格快取策略範例:

  • 請考慮想要使用感興趣的 frustum 型空間量的應用程式,該空間量會遵循使用者的注視,就像他們一樣四處查看並四處走動。
  • 空間表面可能會暫時從這個磁片區消失,因為使用者會從表面外看,或進一步離開它...只會在稍後再次回頭查看或再次移動。 在此情況下,捨棄並重新建立此表面的網格代表許多備援處理。
  • 為了減少已處理的變更數目,應用程式會使用兩個空間表面觀察者,一個包含在另一個空間表面觀察者中。 較大的磁片區是球面,並遵循使用者 'lazily';它只會在必要時移動,以確保其中心位於使用者的 2.0 公尺內。
  • 新的和更新的空間表面網格一律會從較小的內部表面觀察者處理,但網格會快取到從較大的外部表面觀察者消失為止。 這可讓應用程式避免因為本機使用者移動而處理許多備援變更。
  • 由於空間表面可能會因為追蹤遺失而暫時消失,因此應用程式也會延遲在追蹤遺失期間捨棄移除的空間表面。
  • 一般而言,應用程式應該評估減少的更新處理和增加記憶體使用量之間的取捨,以判斷其理想的快取策略。

轉譯

空間對應網格通常會用於轉譯的主要方式有三種:

  • 針對表面視覺效果
    • 直接視覺化空間表面通常很有用。 例如,將「陰影」從物件轉型至空間表面,可以在使用者將全像投影放在表面時提供實用的視覺回饋。
    • 請記住,空間網格與 3D 藝術師可能建立的網格類型不同。 三角形拓撲不會像人類建立的拓撲一樣「乾淨」,而且網格會受到 各種錯誤影響。
    • 若要建立美觀的視覺美感,您可能想要進行一些 網格處理,例如填滿孔或平滑表面法線。 您也可以使用著色器,在網格上投影藝術師設計的紋理,而不是直接視覺化網格拓撲和常態。
  • 在真實世界表面後方遮蔽全像投影
    • 空間表面可以在僅限深度傳遞中轉譯,這只會影響 深度緩衝區 ,且不會影響色彩轉譯目標。
    • 這會在空間表面後方遮蔽後續呈現的全像投影深度緩衝區。 全像投影的精確遮蔽可增強全像投影確實存在於使用者實體空間中的意義。
    • 若要啟用僅限深度轉譯,請更新混合狀態,將所有色彩轉譯目標設定為零 RenderTargetWriteMask
  • 修改真實世界表面遮蔽的全像投影外觀
    • 一般呈現的幾何會在遮蔽時隱藏。 這可藉由將深度樣板狀態中的深度函式設定為「小於或等於」來達成此目的,這只會讓幾何顯示在相機接近所有先前轉譯幾何的位置
    • 不過,即使遮蔽了特定幾何,也可能需要讓某些幾何保持可見,並在遮蔽時修改其外觀,以提供視覺回饋給使用者的方式。 例如,這可讓應用程式向使用者顯示物件的位置,同時清楚指出位於真實世界表面後方。
    • 若要達成此目的,請使用建立所需「遮蔽」外觀的不同著色器,第二次轉譯幾何。 第二次轉譯幾何之前,請先對 深度樣板狀態進行兩項變更。 首先,將深度函式設定為「大於或等於」,讓幾何只有在相機 更進一步 的地方才會顯示,而不是所有先前呈現的幾何。 其次,將 DepthWriteMask 設定為零,讓深度緩衝區不會修改 (深度緩衝區應該繼續代表 最接近 相機的幾何深度) 。

轉譯空間對應網格時,效能是一個重要考慮。 以下是轉譯空間對應網格特有的一些轉譯效能技術:

  • 調整三角形密度
    • 向表面觀察者要求空間表面網格時,請要求三角形網格的最低密度,以符合您的需求。
    • 根據表面與使用者的距離,根據表面與使用者之間的距離,以及其與使用者體驗的相關性,可能會根據表面而改變三角形密度。
    • 減少三角形計數可減少 GPU 上的記憶體使用量和頂點處理成本,但不會影響圖元處理成本。
  • 使用 frustum 擷取
    • Frustum 擷取會略過無法看見的繪圖物件,因為它們位於目前的顯示範圍之外。 這可減少 CPU 和 GPU 處理成本。
    • 由於擷取是以每個網格為基礎執行,而且空間表面可能很大,因此將每個空間表面網格分成較小的區塊,可能會導致更有效率地擷取 (,這樣會轉譯較少的非螢幕三角形) 。 不過,有取捨;您擁有的網格越多,您必須進行的繪製呼叫越多,會增加 CPU 成本。 在極端的情況下,擷取計算本身甚至可能會有可測量的 CPU 成本。
  • 調整轉譯順序
    • 空間表面通常很大,因為它們代表使用者周圍的整個環境。 GPU 上的圖元處理成本可能很高,特別是在有一層以上的可見幾何 (包括空間表面和其他全像投影) 的情況下。 在此情況下,最接近使用者的圖層將會遮蔽任何更遠的圖層,因此任何花費在轉譯更遠層的 GPU 時間都會浪費。
    • 為了減少 GPU 上的這個備援工作,它有助於在前至後的順序轉譯不透明表面, (先更接近,更遠的介面) 。 藉由 「不透明」,我們表示 DepthWriteMask 設定為 深度樣板狀態的介面。 轉譯最接近的介面時,它們會優先處理深度緩衝區,讓 GPU 上的圖元處理器有效率地略過更遠的介面。

網格處理

應用程式可能會想要在空間表面網格上執行 各種作業 ,以符合其需求。 提供給每個空間表面網格的索引和頂點資料會使用與所有新式轉譯 API 中轉譯三角形網格所使用的 頂點和索引緩衝區 相同的配置。 不過,要注意的其中一個主要事實是空間對應三角形具有 順時針繞時針順序。 每個三角形都會以網格索引緩衝區中的三個頂點索引表示,而且當三角形從前端檢視時,這些索引會以順時針順序識別三角形的頂點。 空間表面網格的前端 (或外部) 對應,如同預期真實世界表面的正面 (可見) 面。

如果表面觀察者所提供的粗三角形密度仍然不夠粗細,則應用程式應該只會進行網格簡化-這項工作的成本很高,而且執行時間已經執行,以產生各種提供的詳細資料層級。

由於每個表面觀察者都可以提供多個未連接的空間表面,因此某些應用程式可能會想要彼此裁剪這些空間表面網格,然後將它們壓縮在一起。 一般而言,裁剪步驟是必要的,因為附近的空間表面網格通常會稍微重迭。

Raycasting and Collision

為了讓物理 API (,例如 Havok) ,為應用程式提供空間表面的光線傳播和碰撞功能,應用程式必須將空間表面網格提供給物理 API。 用於物理的網格通常具有下列屬性:

  • 它們只包含少量的三角形。 物理運算比轉譯作業更大量運算。
  • 它們是「水緊密」。 要實心的表面不應該有小型的漏洞;即使是太小而無法看見的漏洞,也可能會造成問題。
  • 它們會轉換成凸殼。 凸殼有幾個多邊形,而且沒有漏洞,而且比原始三角形網格更有計算效率。

針對空間表面執行光線廣播時,請記住,這些表面通常很複雜、雜亂的圖形,其中包含雜亂的小型詳細資料,就像您的桌面一樣! 這表示單一光線廣播通常不足以提供表面圖形及其附近空白空間的足夠資訊。 通常最好在小型區域內執行許多光線廣播,並使用匯總結果來衍生對表面的更可靠瞭解。 例如,使用平均 10 個光線廣播來引導表面的全像投影放置,只會使用單一光線廣播產生更平滑且較不具「抖動」的結果。

不過,請記住,每個光線廣播可以有高計算成本。 根據您的使用案例,您應該取捨額外光線廣播的計算成本, (針對 網格處理的 計算成本完成每個框架) ,以平滑並移除空間表面 (在空間網格更新時) 完成的漏洞。

環境掃描體驗

每個使用空間對應的應用程式都應該考慮提供「掃描體驗」;應用程式引導使用者掃描應用程式正常運作所需表面的程式。

掃描範例
掃描範例

此掃描體驗的本質可能會根據每個應用程式的需求而有很大的差異,但兩個主要原則應引導其設計。

首先, 與使用者清楚通訊是主要考慮。 使用者應該一律注意是否符合應用程式的需求。 不符合時,使用者應該立即清楚為何如此,因此應該快速引導他們採取適當的動作。

其次, 應用程式應該嘗試達到效率和可靠性之間的平衡。 如果可以 可靠地執行這項操作,應用程式應該會自動分析空間對應資料,以節省使用者時間。 當無法可靠地執行這項操作時,應用程式應該改為讓使用者快速提供應用程式所需的其他資訊。

為了協助設計正確的掃描體驗,請考慮下列哪一種可能適用于您的應用程式:

  • 沒有掃描體驗

    • 應用程式可以完全運作,而不需要任何引導式掃描體驗;它會瞭解自然使用者移動過程中觀察到的表面。
    • 例如,讓使用者使用全像噴水畫在表面繪製的應用程式,只需要瞭解使用者目前可見的介面。
    • 如果環境是使用者已花費大量時間使用 HoloLens,就可能已經掃描環境。
    • 不過,請記住,空間對應所使用的相機只能看到使用者前面的 3.1 公尺,因此除非使用者在過去從更遠的距離觀察到空間對應,否則空間對應不會知道更遠的表面。
    • 因此,使用者瞭解已掃描哪些表面,應用程式應該提供此效果的視覺回饋,例如將虛擬陰影投射到掃描表面,可協助使用者在那些表面放置全像投影。
    • 在此情況下,空間表面觀察者的周框磁片區應該將每個框架更新為主體鎖定 的空間座標系統,以便遵循使用者。
  • 尋找適合的位置

    • 應用程式可能設計成用於具有特定需求的位置。
    • 例如,應用程式可能需要使用者周圍的空白區域,以便安全地練習全像攝影 kung-fu。
    • 應用程式應該在使用者前方傳達任何特定需求,並以清楚的視覺回饋來強化這些需求。
    • 在此範例中,應用程式應該將所需空白區域的範圍視覺化,並以視覺化方式醒目提示此區域內任何不想要的物件存在。
    • 在此情況下,空間表面觀察者的周框磁片區應該在所選的位置使用世界鎖定 的空間座標系統
  • 尋找適合的介面組態

    • 應用程式可能需要特定的表面組態,例如兩個大型、平面、反牆,以建立全像攝影的鏡像大廳。
    • 在這種情況下,應用程式必須分析空間對應所提供的表面,以偵測適當的表面,並將使用者導向它們。
    • 如果使用者的介面分析不可靠,則使用者應該有後援選項。 例如,如果應用程式不正確地將門道識別為一般牆,則使用者需要簡單的方法來更正此錯誤。
  • 掃描環境的一部分

    • 應用程式可能只想要擷取使用者的一部分環境。
    • 例如,應用程式會掃描會議室的一部分,讓使用者可以張貼全像攝影分類廣告,以供他們想要銷售的房間。
    • 在此情況下,應用程式應該擷取使用者在掃描期間觀察到的區域空間對應資料。
  • 掃描整個房間

    • 應用程式可能需要掃描目前會議室中的所有表面,包括使用者後方。
    • 例如,遊戲可能會讓使用者扮演 Gulliver 角色,從數百位小型 Lilliputian 從所有方向開始。
    • 在這種情況下,應用程式必須判斷目前會議室中已掃描多少表面,並引導使用者的注視填滿顯著差距。
    • 此程式的關鍵在於提供視覺意見反應,讓使用者清楚看到尚未掃描的介面。 例如,應用程式可以使用 以距離為基礎的模糊 ,以視覺方式醒目提示空間對應表面未涵蓋的區域。
  • 建立環境的初始快照集

    • 在建立初始'snapshot' 之後,應用程式可能會想要忽略環境中的所有變更。
    • 這可能適合避免使用者建立的資料中斷,而該資料緊密結合至環境的初始狀態。
    • 在此情況下,應用程式應該在掃描完成後,以初始狀態複製空間對應資料。
    • 如果環境仍然無法正確遮蔽全像投影,應用程式應該繼續接收空間對應資料的更新。
    • 空間對應資料的繼續更新也允許視覺化發生的任何變更,以厘清使用者環境先前和目前狀態之間的差異。
  • 擷取環境的使用者起始快照集

    • 當使用者指示時,應用程式可能只想要回應環境變更。
    • 例如,使用者可以藉由在不同時間擷取他們的姿勢,來建立多位朋友的 3D「擷取」。
  • 允許使用者變更環境

    • 應用程式的設計目的是要即時回應使用者環境中所做的任何變更。
    • 例如,使用者繪製場景可能會觸發另一端進行全像攝影遊戲的「場景變更」。
  • 引導使用者避免空間對應資料發生錯誤

    • 應用程式可能想要在使用者掃描環境時提供指引。
    • 這可協助使用者避免 空間對應資料中某些類型的錯誤,例如離開日光燈視窗或鏡像。

要注意的一個額外詳細資料是空間對應資料的「範圍」並不無限制。 雖然空間對應會建置大型空間的永久資料庫,但它只會讓應用程式在使用者周圍具有有限大小的「泡泡」中提供該資料。 如果您從一個很長的起點開始,並離開開始夠遠的地方,則最後一開始的空間表面將會消失。 您可以在應用程式從可用的空間對應資料消失之後,快取應用程式中的這些表面,以減輕此問題。

網格處理

它可能有助於偵測介面中的常見錯誤類型,並視需要篩選、移除或修改空間對應資料。

請記住,空間對應資料的目的是盡可能與真實世界表面一致,因此,任何您套用的風險都會從「真實」進一步轉移表面。

以下是一些不同類型的網格處理範例,您可能會發現這些範例很有用:

  • 孔填滿

    • 如果由深色材質建立的小型物件無法掃描,則會在周圍表面留下一個空洞。
    • 漏洞會影響遮蔽:全像投影可以「透過」一個可能不透明真實表面的孔。
    • 漏洞會影響光線傳播:如果您使用光線廣播來協助使用者與表面互動,這些光線可能會不想要通過漏洞。 其中一個緩和措施是使用涵蓋適當大小的區域之多個光線廣播組合。 這可讓您篩選「極端值」結果,如此一來,即使一個光線廣播通過小孔,匯總結果仍然有效。 不過,這種方法會以計算成本計算。
    • 漏洞會影響物理碰撞:由物理模擬控制的物件可能會落在樓層中的空洞並遺失。
    • 可以在表面網格中以演算法方式填滿這類漏洞。 不過,您必須調整演算法,讓視窗和門道等「真實漏洞」不會填入。 很難可靠地區分「真實漏洞」與「虛空孔」,因此您必須試驗不同的啟發學習法,例如「大小」和「界限形狀」。
  • Hallucination 移除

    • 反射、亮燈和移動物件可以讓小型的'hallucinations' 在空中浮動。
    • Hallucinations 會影響遮蔽:當深色圖案在前面移動並遮蔽其他全像投影時,可能會變成全像投影。
    • Hallucinations 會影響光線廣播:如果您使用光線廣播來協助使用者與表面互動,這些光線可能會叫用全場,而不是其後方的表面。 如同漏洞,一個風險降低是使用許多光線廣播,而不是單一光線廣播,但同樣地,這會產生計算成本。
    • Hallucinations 會影響物理衝突:由物理模擬控制的物件可能會卡在全貌上,而且無法通過看似清楚的空間區域。
    • 您可以從表面網格篩選這類概念。 不過,如同漏洞,您必須調整演算法,讓實際的小型物件,例如燈檯和門控點不會移除。
  • 平滑處理

    • 相較于其真實世界對應,空間對應可能會傳回看似粗略或「雜訊」的表面。
    • 平滑度會影響物理碰撞:如果樓層很粗略,實體模擬的球可能不會在直線中順暢地變換。
    • 平滑度會影響轉譯:如果直接視覺化表面,粗略表面常態可能會影響其外觀,並中斷「乾淨」的外觀。 您可以使用著色器中用來呈現表面的適當光源和紋理,來減輕此問題。
    • 可以在表面網格中平滑化粗略度。 不過,這可能會將表面從對應的真實世界表面進一步推送。 維護緊密對應對於產生精確的全像投影遮蔽很重要,並讓使用者能夠與全像攝影表面達到精確且可預測的互動。
    • 如果只需要外觀變更,可能就足以平滑頂點常態,而不需要變更頂點位置。
  • 平面尋找

    • 應用程式可能會想要在空間對應所提供的介面上執行許多形式的分析。
    • 其中一個簡單範例是「平面尋找」;識別周框的平面區域。
    • 平面區域可用來做為全像攝影工作介面、應用程式可自動放置全像攝影內容的區域。
    • 平面區域可以限制使用者介面,以引導使用者與最符合其需求的介面互動。
    • 平面區域可以當作真實世界使用,讓全像攝影對應專案能夠運作的物件,例如 LED 螢幕、資料表或白板。
    • 平面區域可以定義播放區域,形成視訊遊戲層級的基礎。
    • 平面區域可協助虛擬代理程式巡覽真實世界,方法是識別真實人可能要逐步執行的樓層區域。

原型設計和偵錯

有用的工具

  • HoloLens 模擬器可用來使用空間對應來開發應用程式,而不需要存取實體 HoloLens。 它可讓您在實際環境中模擬 HoloLens 上的即時會話,而您的應用程式通常會取用的所有資料,包括 HoloLens 動作、空間座標系統和空間對應網格。 這可用來提供可靠、可重複的輸入,這對於偵錯問題及評估程式碼的變更很有用。
  • 若要重現案例,請從即時 HoloLens 透過網路擷取空間對應資料,然後將它儲存到磁片,並在稍後的偵錯會話中重複使用。
  • Windows 裝置入口網站 3D 檢視可讓您查看目前可透過空間對應系統取得的所有空間表面。 這會為應用程式內的空間表面提供比較的基礎;例如,您可以輕鬆地分辨是否有任何空間表面遺失或顯示于錯誤的位置。

一般原型設計指引

  • 由於空間對應資料中的 錯誤 可能會大幅影響使用者體驗,因此建議您在各種不同的環境中測試您的應用程式。
  • 請勿在一律在相同位置測試的習慣中截獲,例如在桌面上。 請務必在不同位置、圖形、大小和材質的各種表面上進行測試。
  • 同樣地,雖然綜合或記錄的資料對於偵錯很有用,但不會依賴相同的幾個測試案例。 這可能會延遲找出稍早發現更不同測試的重要問題。
  • 最好是使用實際 (執行測試,而且最好是未編碼) 使用者,因為它們可能不會以完全相同的方式使用 HoloLens 或您的應用程式。 事實上,您可能會驚奇人們的行為、知識與假設可能如何!

疑難排解

  • 為了讓表面網格正確導向,每個 GameObject 必須在傳送至 SurfaceObserver 之前使用中,才能建構其網格。 否則,網格會顯示在您的空間中,但以奇怪的角度旋轉。
  • 執行與 SurfaceObserver 通訊之腳本的 GameObject 必須設定為原點。 否則,您建立並傳送至 SurfaceObserver 的所有 GameObjects 都會建構其網格,其位移等於父遊戲物件的位移。 這可讓您的網格顯示數公尺,因此很難對發生什麼事進行偵錯。

另請參閱