全像投影穩定性
為了達到穩定的全像投影,HoloLens 具有內建的影像防震管線。 防震管線會在背景自動運作,因此您不需要採取任何額外的步驟來啟用它。 不過,您應該練習可改善全像投影穩定性的技術,並避免降低穩定性的案例。
全像投影品質術語
全像投影的品質是良好環境和良好應用程式開發的結果。 在 HoloLens 可以追蹤周圍的環境中,以常數 60 個畫面格每秒執行的應用程式,可確保全像投影和比對座標系統同步。從使用者的觀點來看,意謂固定的全像投影不會相對於環境移動。
下列術語可協助您找出環境的問題、不一致或低轉譯率,或任何其他專案。
- 精確度。 一旦全像投影被世界鎖定並放置在真實世界中,它應該會保留在相對於周圍環境的位置,而且與使用者動作或小型和疏鬆環境變更無關。 如果稍後全像投影出現在非預期的位置,則這是 精確度 問題。 如果兩個不同的會議室看起來完全相同,就可能發生這類案例。
- 抖動。 使用者觀察到全像投影的高頻率震動,這可能會在追蹤環境降低時發生。 針對使用者,解決方案正在執行 感應器微調。
- Judder。 低轉譯頻率會導致全像投影的動作不平均和雙影像。 Judder 在具有動作的全像投影中特別明顯。 開發人員需要維護 常數 60 FPS。
- 漂移。 使用者會看到漂移,因為全像投影似乎離開原本放置的位置。 當您將全像投影放在離 空間錨點遠的地方時,就會發生漂移,特別是環境未對應的部分。 建立接近空間錨點的全像投影可降低漂移的可能性。
- 跳躍性。 當全像投影「快顯」或「跳躍」偶爾離開其位置時。 當追蹤調整全像投影以符合您環境的更新瞭解時,可能會發生跳躍。
- 游泳。 當全像投影出現時,會對應至使用者頭部的動作。 當應用程式尚未完全實作 重現,且 HoloLens 未針對目前使用者 進行校正 時,就會發生泳道。 使用者可以重新執行 校正 應用程式以修正問題。 開發人員可以更新防震平面,以進一步增強穩定性。
- 色分隔。 HoloLens 中的顯示器是色序顯示器,在 60 Hz (個別色彩欄位會顯示在 240 Hz) 的紅色-綠色-藍-綠色的閃爍色彩通道。 每當使用者以眼睛追蹤移動全像投影時,該全像投影的前置和尾端邊緣會以組成色彩分開,產生一個青色效果。 分離的程度取決於全像投影的速度。 在某些罕見的情況下,在查看固定全像投影時,快速移動頭部,也會導致一個稱為 色彩分離的淡色效果。
畫面播放速率
畫面播放速率是全像投影穩定性的第一個要素。 若要讓全像投影在世界中呈現穩定,向使用者呈現的每個影像都必須以正確的位置繪製全像投影。 HoloLens 上的顯示器每秒重新整理 240 次,顯示每個新轉譯影像的四個不同的色彩欄位,導致每秒 60 FPS (畫面的使用者體驗) 。 為了提供最佳體驗,應用程式開發人員必須維護 60 FPS,這會轉譯成每隔 16 毫秒將新的映射一致地提供給作業系統。
60 FPS 若要繪製全像投影,使其看起來像在真實世界,HoloLens 必須從使用者的位置轉譯影像。 由於影像轉譯需要時間,HoloLens 會預測使用者頭部會在顯示影像時的位置。 不過,此預測演算法是近似值。 HoloLens 有硬體可調整轉譯的影像,以考慮預測的前端位置與實際前端位置之間的差異。 調整會使使用者看到的影像看起來就像從正確的位置轉譯,而全像投影感覺穩定。 影像更新最適合使用小型變更,而且無法完全修正轉譯影像中的某些專案,例如動作視差。
藉由在 60 FPS 轉譯,您會執行三件事來協助建立穩定的全像投影:
- 將轉譯影像與使用者看到之影像之間的整體延遲降到最低。 在具有遊戲和在鎖定步驟中執行的轉譯執行緒的引擎中,在 30FPS 上執行可以新增 33.3 毫秒的額外延遲。 減少延遲會減少預測錯誤,並增加全像投影穩定性。
- 讓每一個影像觸達使用者的眼睛都有一致的延遲量。 如果您轉譯為 30 fps,顯示器仍會顯示 60 FPS 的影像,這表示相同的影像會在一列中顯示兩次。 第二個畫面的延遲比第一個畫面多 16.6 毫秒,而且必須更正更明顯的錯誤數量。 錯誤大小不一致可能會導致不必要的 60 Hz judder。
- 減少出現顫抖,它的特色是不平均的運動和雙重影像。 更快的全像投影動作和更低的轉譯率與更明顯的顫抖相關聯。 隨時努力維護 60 FPS 有助於避免特定移動全像投影的 Judder。
畫面播放速率一致性 畫面播放速率一致性與每秒高畫面格一樣重要。 有時候卸載的畫面對於任何內容豐富的應用程式而言都是不可避免的,而 HoloLens 會實作一些複雜的演算法,以從偶爾發生問題中復原。 不過,使用者比以較低的畫面播放速率一致執行,不斷變動的畫面播放速率會更明顯。 例如,在五個畫面格 (60 FPS 的期間,) 順暢地轉譯五個畫面格的應用程式,然後針對接下來 10 個畫面 (30 FPS 捨棄每個其他畫面格,) 在 30 FPS 的持續時間內,看起來會比持續轉譯為 30 FPS 的應用程式更為不穩定。
在相關注意事項中,當 混合實境擷取 執行時,作業系統會將應用程式節流至 30 FPS。
效能分析 有不同類型的工具可用來對應用程式畫面播放速率進行基準測試,例如:
- GPUView
- Visual Studio 圖形偵錯工具
- 內建于 3D 引擎的分析工具,例如 Unity
全像投影轉譯距離
人類視覺系統會在修正並著重于物件時,整合多個距離相依訊號。
- 適應 - 個別眼睛的焦點。
- 聚合 - 兩個眼睛向內或向外移動,以在物件上置中。
- 雙眼視覺 - 左眼和右眼影像之間的差異,這些影像相依于物件的距離與固定點的距離。
- 網底、相對角度大小和其他單色 (單眼) 提示。
聚合和適應是獨特的,因為其額外直覺提示與眼睛如何改變以不同距離來察覺物件有關。 在自然檢視中,聚合和適應會連結。 例如,當眼睛檢視靠近 (時,您的眼睛) ,眼睛會交叉並適應接近點。 當眼睛檢視無限大時,眼睛會變成平行,而眼睛會容納無限大。
戴著 HoloLens 的使用者一律會容納 2.0 公尺以維持清楚的影像,因為 HoloLens 顯示器會固定在大約 2.0 公尺的距離與使用者距離。 應用程式開發人員藉由將內容和全像投影放在各種深度,來控制使用者眼睛的交集位置。 當使用者適應並交集到不同的距離時,這兩個提示之間的自然連結會中斷,這可能會導致視覺不適或疲勞,特別是當衝突的大小很大時。
如果可能的話,盡可能將聚合內容保持在接近 2.0 公尺的 (,就可避免或最小化來自頂點衝突的不適,也就是說,在深度很深的場景中,盡可能將感興趣的區域放在 2.0 公尺附近,) 。 當內容無法放置在 2.0 公尺附近時,當使用者在不同距離之間來回注視時,來自頂點-調和衝突的不適是最大的。 換句話說,觀看保持在 50 公分距離的固定全像投影,比觀看在 50 公分距離而隨著時間離您忽遠忽近的全像投影,要來得舒適。
將內容放在 2.0 公尺也比較好,因為兩個顯示器的設計目的是要完全重迭于這個距離。 對於放置於此平面的影像,當影像離開全像攝影畫面的側邊時,它們會顯示在一個顯示器上,同時仍會在另一個顯示器上顯示。 這個雙眼擷取可能會干擾全像投影的深度感知。
放置距離使用者的全像投影最佳距離
裁剪平面 為了達到最大舒適度,我們建議在 85 公分裁剪轉譯距離,從 1 公尺開始淡出內容。 在全像投影和使用者都固定的應用程式中,全像投影可輕易地以接近 50 公分的方式檢視。在這些情況下,應用程式應該將剪輯平面放在不超過 30 公分,而淡出應該從裁剪平面開始至少 10 公分。 每當內容接近 85 公分時,請務必確保使用者不會經常從全像投影更近或更遠地移動,或全像投影不會經常更接近或更遠的使用者,因為這些情況最有可能造成頂點衝突的不適。 內容的設計目的是要盡可能減少使用者更接近 85 公分的互動需求,但當內容必須轉譯為接近 85 公分時,開發人員的良好經驗法則是設計使用者和/或全像投影不會在 25% 以上的時間深入移動的情況。
最佳做法 當全像投影無法置於 2 公尺,且無法避免聚合和適應之間的衝突時,全像投影放置的最佳區域介於 1.25 公尺到 5 公尺之間。 在每個案例中,設計工具都應該建構內容,以鼓勵使用者互動 1+ 公尺 (,例如,調整內容大小和預設放置參數) 。
Reprojection
HoloLens 具有複雜的硬體輔助全像攝影防震技術,稱為重新投影。 Reprojection 會將相機 (檢視點的動作和變更納入考慮,) 當場景動畫顯示時,使用者移動其頭部。 應用程式需要採取特定動作,才能充分利用重現。
重現有四種主要類型
- 深度重現: 從應用程式產生最不費力的最佳結果。 轉譯場景的所有部分都會根據使用者與使用者的距離獨立穩定。 某些轉譯成品可能會顯示在深度有尖角變更的位置。 此選項僅適用于 HoloLens 2 和沈浸式頭戴式裝置。
- Planar Reprojection: 允許應用程式精確控制防震。 平面是由應用程式所設定,而該平面上的所有專案都會是場景的最穩定部分。 全像投影進一步離開平面,則較不穩定。 此選項適用于所有 Windows MR 平臺。
- 自動計劃性重現: 系統會使用深度緩衝區中的資訊來設定防震平面。 此選項適用于 HoloLens 第 1 代和HoloLens 2。
- 沒有: 如果應用程式沒有執行任何動作,則 Planar Reprojection 會搭配固定在使用者頭部注視方向 2 公尺的防震平面使用,通常會產生次標準的結果。
應用程式需要採取特定動作,才能啟用不同類型的重現
- 深度重現: 應用程式會針對每個轉譯的畫面,將其深度緩衝區提交至系統。 在 Unity 上,深度重現是使用[XR 外掛程式管理] 下[Windows Mixed Reality設定] 窗格中的[共用深度緩衝區] 選項來完成。 DirectX 應用程式會呼叫 CommitDirect3D11DepthBuffer。 應用程式不應該呼叫 SetFocusPoint。
- Planar Reprojection: 在每個框架上,應用程式會告訴系統平面的位置穩定。 Unity 應用程式會呼叫 SetFocusPointForFrame,而且應該已停用 共用深度緩衝區 。 DirectX 應用程式會呼叫 SetFocusPoint,不應呼叫 CommitDirect3D11DepthBuffer。
- 自動計劃性重現: 若要啟用,應用程式必須將深度緩衝區提交至系統,如同深度重現一樣。 使用 Mixed Reality 工具組的應用程式 (MRTK) 可以將相機設定提供者設定為使用 AutoPlanar Reprojection。 原生應用程式應該將HolographicCameraRenderingParameters中的 設定
DepthReprojectionMode
為AutoPlanar
每個畫面。 針對 HoloLens 第 1 代,應用程式不應該呼叫 SetFocusPoint。
選擇重現技術
防震類型 | 沉浸式頭戴式裝置 | HoloLens 第 1 代 | HoloLens 2 |
---|---|---|---|
深度重現 | 建議 | N/A | 建議 Unity 應用程式必須使用 Unity 2018.4.12+、Unity 2019.3+ 或 Unity 2020.3+。 否則,請使用自動計劃性重現。 |
自動計劃性重現 | N/A | 建議的預設值 | 如果深度重現未提供最佳結果,建議使用 建議使用 Unity 2018.4.12+、Unity 2019.3+ 或 Unity 2020.3+。 舊版 Unity 將處理稍微降級的重現結果。 |
Planar Reprojection | 不建議 | 如果自動平面未提供最佳結果,建議使用 | 如果兩個深度選項都未提供所需的結果,請使用 |
確認深度已正確設定
當重現方法使用深度緩衝區時,請務必確認深度緩衝區的內容代表應用程式的轉譯場景。 許多因素可能會導致問題。 例如,如果有第二個相機用來轉譯使用者介面重迭,則可能覆寫實際檢視中的所有深度資訊。 透明物件通常不會設定深度。 某些文字轉譯預設不會設定深度。 當深度與轉譯的全像投影不符時,呈現中會有可見的問題。
HoloLens 2有視覺化檢視可顯示深度和未設定的位置,可從裝置入口網站啟用。 在 [檢視>全像投影穩定性] 索引標籤上,選取 [在頭戴式裝置中顯示深度視覺效果] 核取方塊。 已正確設定深度的區域會是藍色。 沒有深度設定的轉譯專案會以紅色標示,而且必須修正。
注意
深度的視覺效果不會顯示在Mixed Reality擷取中。 它只會透過裝置顯示。
某些 GPU 檢視工具允許深度緩衝區的視覺效果。 應用程式開發人員可以使用這些工具,確定已正確設定深度。 請參閱應用程式工具的檔。
使用 Planar Reprojection
注意
針對桌面沉浸式頭戴式裝置,設定防震平面通常具有反生產力,因為它所提供的視覺品質比為系統提供應用程式的深度緩衝區來啟用個別圖元深度型重現還要少。 除非在 HoloLens 上執行,否則您通常應該避免設定防震平面。
裝置會自動嘗試選擇此平面,但應用程式應該藉由選取場景中的焦點來協助。 在 HoloLens 上執行的 Unity 應用程式應該根據您的場景選擇最佳焦點,並將其傳遞至 SetFocusPoint () 。 在 DirectX 中設定焦點的範例包含在預設旋轉 Cube 範本中。
當您在連線到桌上型電腦的沉浸式頭戴式裝置上執行應用程式時,Unity 會將深度緩衝區提交至 Windows,以啟用個別圖元的重現,以提供更佳的影像品質,而不需要應用程式明確工作。 只有在您的應用程式在 HoloLens 上執行時,否則將會覆寫個別圖元的重現時,才應該提供焦點。
// SetFocusPoint informs the system about a specific point in your scene to
// prioritize for image stabilization. The focus point is set independently
// for each holographic camera.
// You should set the focus point near the content that the user is looking at.
// In this example, we put the focus point at the center of the sample hologram,
// since that is the only hologram available for the user to focus on.
// You can also set the relative velocity and facing of that content; the sample
// hologram is at a fixed point so we only need to indicate its position.
renderingParameters.SetFocusPoint(
currentCoordinateSystem,
spinningCubeRenderer.Position
);
焦點的位置主要取決於全像投影所查看的內容。 應用程式具有參考的注視向量,而應用程式設計工具知道他們想要使用者觀察的內容。
開發人員可以執行的最重要工作是穩定全像投影,以 60 FPS 轉譯。 低於 60 FPS 會大幅降低全像投影穩定性,無論防震平面優化為何。
最佳做法 沒有通用方式可以設定防震平面,而且是應用程式特定的。 我們的主要建議是實驗,並查看最適合您案例的內容。 不過,嘗試盡可能將防震平面與內容對齊,因為此平面上的所有內容都完全穩定。
例如:
- 如果您只有平面內容 (讀取應用程式,視訊播放應用程式) ,請將防震平面與具有您內容的平面對齊。
- 如果有三個被世界鎖定的小型球體,請讓防震平面「剪下」,但目前在使用者檢視中的所有球體中心。
- 如果您的場景具有相當不同的深度內容,請偏好進一步的物件。
- 請務必調整每一個畫面的防震點,以與使用者正在查看的全像投影一致
要避免的事項 防震平面是達到穩定全像投影的絕佳工具,但如果誤用,可能會導致嚴重的影像不穩定。
- 別「引發並忘記」。 最後,您可以在使用者後方加上防震平面,或附加至不再位於使用者檢視中的物件。 確定防震平面正常設定相反的相機向前 (例如 -camera.forward)
- 不要在極端之間快速變更防震平面
- 不要讓防震平面設定為固定距離/方向
- 不要讓防震平面通過使用者
- 不要在桌上型電腦上執行時設定焦點,而不是 HoloLens,而是依賴每個圖元的深度型重現。
色隔
由於 HoloLens 的本質,有時可能會察覺稱為「色彩分隔」的成品。 其會以影像的形式顯示為個別基底色彩 -紅色、綠色和藍色。 成品在顯示白色物件時特別可見,因為它們有大量的紅色、綠色和藍色。 當使用者以視覺化方式追蹤全像投影,以高速跨全像攝影畫面移動時,最明顯。 成品可以資訊清單的另一種方式是扭曲/換行的物件。 如果物件具有高對比和/或純色,例如紅色、綠色、藍色、色彩分隔,將會被視為物件不同部分的變形。
當使用者將頭部旋轉到側邊時,頭部鎖定白色圓游標的色彩分隔範例可能看起來像這樣:
雖然很難完全避免色彩分離,但有數種技術可用來減輕色彩分色。
您可以在下列專案上看到色彩分隔:
若要衰減色彩分隔的效果:
- 讓物件延隔使用者的注視。 它看起來應該像有一些慣性,並附加至注視「在彈簧上」。 此方法會讓游標變慢 (減少分隔距離) ,並將它放在使用者可能注視點後面。 只要使用者停止移動其注視時快速趕上,就會覺得自然。
- 如果您想要移動全像投影,如果您預期使用者用他們的眼睛追蹤它,請嘗試將其移動速度保持在低於 5 度/秒。
- 針對游標使用 光線 而非 幾何 。 附加至注視的虛擬光源來源會被視為互動式指標,但不會造成色彩分離。
- 調整穩定平面,以符合使用者正在擷取的全像投影。
- 將物件設為紅色、綠色或藍色。
- 切換至模糊的內容版本。 例如,圓形白色游標可能會變更為動作方向稍微模糊的線條。
如同之前,在 60 FPS 轉譯和設定防震平面是全像投影穩定性最重要的技術。 如果遇到明顯的色彩分隔,請先確定畫面播放速率符合預期。