空格釘選
要解決的問題
縮放錯誤
雖然將 全像投影 與真實世界特徵對齊的傳統空間錨點方法在小規模上效果很好,但隨著規模的增長,它很難包含超過一米左右。
頭部追蹤空間中的縮放誤差表示,即使空間錨點保持虛擬物件的一端,大小只有幾公尺長,與真實世界特徵完美對齊,另一端可能與對應的真實世界特徵不對齊。 這種錯位是因為經過頭部追蹤空間的距離往往與透過實體空間移動的距離不同,錯誤界限為 +-10%。 實際錯誤通常較少(這取決於許多環境和裝置特性),但一般會相當重要,而且隨著專案的規模成長,不會有界限地成長。
換句話說,如果身穿 HoloLens 的使用者在現實世界中走了 10 米,那麼在虛擬空間中移動的距離,如頭部跟蹤器所報告,將介於 9 米到 11 米之間。 如果使用者步行 50 公尺,則錯誤會成長為 +-5 公尺。 使用者走得越遠,錯誤越長。
因此,一個10米長的梁(在模型空間中)與實際空間中磁帶測量的零端完美對齊,將另一端登錄到磁帶測量在9到11米之間的某個位置。
基於相同的原因,多個物件,每個使用空間錨點鎖定的世界,在虛擬空間中會與實際空間不同。
任意座標系統
還有另一個問題。 HoloLens 中的 Unity 座標系統不確定。 它只以應用程式開頭的頭部姿勢為基礎。
對於許多工作而言,這種任意性不是問題。 如果目標是將光線投射到空間的空間對應,並將全像投影放在點擊位置,則命中位置的數值無關。
同樣地,在用戶周圍彈出UX元素時,放置UX元素的絕對座標並不重要,只有相對於使用者的座標。
不過,無法預測的座標系統可能會使更多相關的案例變得複雜。 將大量物件集合載入到與實體空間有固定關聯之虛擬空間中,例如使用者的桌面或整個辦公室空間,需要一些補償轉換,才能將模型空間物件與前端座標框架對齊。
這種補償通常是藉由將所有物件附加至單一 Unity 轉換,並調整該單一轉換來定位虛擬物件,並讓虛擬物件與真實世界保持一致。
同樣地,相機階層中的單一轉換可以用來重新調整相機,如此一來,當使用者看到真實世界參考點時,具有所需模型座標的虛擬物件就會出現在該功能上。
解決方案
空格釘選功能可同時解決這兩個問題。 它藉由利用世界鎖定工具全球空間的世界鎖定本質,以及該空間的任意性來這樣做。
將 Unity 空間與真實世界對齊
世界鎖定工具的核心提供穩定的世界鎖定座標系統。 放置於已向真實世界功能註冊的世界鎖定空間中的虛擬物件,將會隨著時間持續向該真實世界功能註冊。
但是,有無限數量的空間滿足這個目標。 事實上,假設有一個世界鎖定的空間,由任何任意位置和旋轉來轉換它,會產生另一個同樣有效的世界鎖定空間。
空格釘選功能會套用另一個條件約束,以移除世界鎖定轉換的不確定本質。
該條件約束是,當「接近」空格釘選時,該空間釘選在世界鎖定空間中的姿勢會與模型空間中的空格釘選的姿勢相同。
請考慮 Unity 場景中的 Cube,其模型是全域座標 (0, 0, 1)。 當場景載入 HoloLens 時,立方體會在初始頭部姿勢前面出現 1 公尺。 根據初始頭部姿勢而定,這可能是實體房間中的任何位置。
空格釘選可讓立方體鎖定到會議室中的真實世界功能,例如特定辦公桌的角落。 不同於使用空間錨點鎖定 Cube,Space Pin 會移動整個 Unity 空間,讓 Cube 與桌面角落對齊。 因此,例如,相對於 Unity 中 Cube 建立模型的其他桌面專案,將會正確地分散到真實桌面。
解決縮放錯誤
雖然單一空格鍵會移除虛擬座標與真實世界之間關聯性不確定,但無法解決縮放錯誤。
也就是說,雖然它可能已經將原點移至實體世界對齊的位置和方向,但在真實世界中走10米可能仍然只會移動使用者9米的虛擬空間。
為此,多個空格釘選會提供完整的解決方案。 當使用者接近任何特定的空格釘選時,世界會根據該Space Pin對齊。 其他空間針腳會錯位,但比較遙遠,這通常被證明是可以接受的,而且往往無法察覺。
當使用者在空格釘選之間移動時,平滑的插補會將空間中任何指定點的縮放錯誤降到最低。 空間釘選的足夠密度作為參考點,實際和虛擬特徵的錯位會縮減為頭部追蹤器錯誤的順序。
雖然空間針腳所需的密度取決於追蹤品質 環境支援 和應用程式的精確度需求,但這裡的某些數位可能有助於設定預期。 在辦公室環境中,具有足夠的光源和可見功能來追蹤,空間針腳之間的間距可減少 10-20 公分超過 10 公尺的累積誤差,減少到公厘誤差(端點的最大誤差 l.t.0.5 釐米、0.0 釐米錯誤)。
持續性
空間釘選功能會與世界鎖定工具的持續性搭配運作。 有手動呼叫叫用腳本的儲存和載入,以及旗標來自動儲存和載入每個會話。
啟用時,世界鎖定工具管理員上的 AutoSave/AutoLoad 功能可讓虛擬世界在後續會話上還原虛擬世界的完整空間對齊。
在實務上,持續性表示可以使用單一或少量的初步會話來建立實體環境的適當掃描,以及使用該實體環境的對齊方式與 Unity 的模型座標空間。 後續會話接著會正確載入與真實世界一致的虛擬環境,而不需要進一步的用戶動作。
插補和推斷
插補和推斷是用來估計未進行直接測量之數據值的技術。 到目前為止所討論的空間針腳是已進行測量的位置。 虛擬座標是所需的座標,而實體座標是我們想要顯示這些虛擬座標的測量座標。
系統會執行插補,但不執行推斷,如下所述。 一般而言,插補比推斷更安全且更穩定。 提供的分次線性插補將滿足大部分應用程式的需求。 推斷較不安全,而且其理想的實作通常需要應用層級的知識。 因此,應用程式會保留處理推斷,如下所述。
若沒有應用程式新增外推釘,在釘選範圍之外,空間會以最接近界限的值,以獨佔方式釘選空間。 如果只有兩個針腳,A 和 B,則當使用者從 A 移至 B 時,釘選會混合 A 所指定的對齊方式與 B 所指定的對齊方式(插補點)。 但是,當用戶傳遞 B 時,釘選鎖定會完全由 B 所指定 (常數延伸模組) 指定。
插補
在針腳之間的 2D 區域中,空間當地語系化會以線性方式插補。 如果正確放置空間針腳,且追蹤錯誤平均分散於區域,則空間針腳之間套用的更正會完全正確。
這裡應該強調,相等誤差分配的假設完全不正確。 不過,線性模型是近似值,可提供絕佳的修正結果。
推斷
系統沒有提供內建外推服務,使用空間針腳凸殼外的常數值延伸。 這個近似值相當於假設,當然,在應用程式提供空間針腳之外沒有縮放錯誤。
不過,如果應用程式知道錯誤分佈,或對估計感到滿意,它可以藉由在周邊新增更多空間針腳來建立所需的任何推斷。
推斷範例
請考慮一個有四個空間針腳的場景,放在一個有4公尺長邊緣的方形中。
現在,假設使用者將移動的實際空間是12公尺 x 12公尺,其實體標記會對應到空間中心周圍的四個針腳。
如果應用程式滿足常數誤差近似值,則其具有新增四個或多個空間針腳所需的所有資訊,以提供整個 12x12m 空間的涵蓋範圍。
我們將依據基數方向、NE、NW、SW 和 SE,將 4x4 方形角落的針腳加上標籤。 我們也會在每個點 virtualNE 等標記虛擬位置,以及每個點 physicalNE 等的實體位置。
其中一個策略是新增外部基數點,以在內部方塊周圍建立 12 米 x 12 公尺的平方,方法是再增加四個基數點、outerNE、outerNW、outerSW 和 outerSE。 每個位置的虛擬和實體位置都很容易計算。 採用 outerNE 例如:
virtualOuterNE = virtualNE + (virtualNE - virtualSW);
physicalOuterNE = physicalNE + (physicalNE - virtualSW);
建立 20x20 公尺的外推空間只會變更套用的差異比例:
scale = (outerSize - innerSize) / innerSize / 2;
virtualOuterNE = virtualNE + (virtualNE - virtualSW) * scale;
physicalOuterNE = physicalNE + (physicalNE - virtualSW) * scale;
尺規為 20 米,內層為 4 米,尺規為 2。
替代策略可能是除了邊角之外再新增8個點,如下所示。 從現有的針腳位置計算位置完全如上所示。 請注意,雖然新增更多針腳通常可改善穩定性,但不一定能改善精確度。
對齊場景的子集
到目前為止,討論涉及由 WorldLockingManager.GetInstance() 擁有和管理的全球 AlignmentManager。 如先前所述,這會將整個全域 Unity 座標空間釘選到策略參考點的實體特徵。
不過,有時候將相同的概念套用至場景的子集。
例如,假設要載入兩部汽車的批注。 這兩輛實體汽車的確切位置無法事先得知,因為根據不同轉銷商的配置,它可能會有所不同。 不過,一旦部署了其中一個實體車輛,就會知道相對於該部署姿勢的所有元件位置。
在此案例中,空間針腳可用來獨立固定每個車輛的虛擬底座和批註。 每個車輛的整個虛擬表示都可以在 Unity 中設定,然後在運行時間對應到實體車輛。 此對齊方式可能是手動使用 MRTK UX,或使用 QR 代碼或任何其他策略進行自動化。 無論如何決定虛擬和實體參考點之間的對應數據,一旦透過空格釘選 API 送至 WLT,WLT 會以感知優化的方式保留虛擬和實體物件。
在對齊全域座標空間的情況下,對齊方式是操作調整節點(通常是相機父系的父系)。 該節點應該視為保留供 WLT 使用。 任何其他竄改該轉換都會導致未定義的行為。
同樣地,對齊子樹時,對齊必須擁有要對齊之子樹的 (sub)根目錄的轉換。 任何外部竄改該轉換都會導致未定義的行為。
在釘選獨立空格之前,它們會隨著釘選全域空間一起拖曳。 不過,一旦釘選獨立空間,它就會被視為釘選到實體世界,因此後續修改將全域空間釘選到實體世界將不會影響它。