Unity 中的相機設定
本文內容
當您戴上混合實境頭戴式裝置時,它會成為全像攝影世界的中心。 Unity 相機 元件會自動處理立體轉譯,並遵循頭部移動和旋轉。 不過,若要完整優化視覺品質與 全像投影穩定性 ,您應該設定以下所述的相機設定。
HoloLens 與 VR 沉浸式頭戴裝置
Unity 相機元件上的預設設定適用于傳統 3D 應用程式,其需要類似 Skybox 的背景,因為它們沒有真實世界。
在 沉浸式頭戴式裝置 上執行時,您會轉譯使用者看到的所有專案,因此您可能會想要保留 skybox。
不過,在HoloLens 之類的全像攝影頭戴式裝置 上執行時,真實世界應該會出現在相機轉譯的所有專案後面。 將相機背景設定為 HoloLens 中的透明 (,黑色會轉譯為透明) 而不是 Skybox 紋理:
在 [階層] 面板中選取 [主要相機]
在 [偵測器] 面板中,尋找 [相機] 元件,並將 [清除旗標] 下拉式清單從 Skybox 變更為純色
選取 [背景色彩選擇器],並將 RGBA 值變更為 (0、0、0、0)
如果從程式碼設定此專案,您可以使用 Unity 的 Color.clear
MRTK 會根據 相機系統設定檔中的組態 ,自動處理特定的相機設定。
Namespace: Microsoft.MixedReality.Toolkit.CameraSystem
Type: MixedRealityCameraSystem
若要檢查相機不透明,MixedRealityCamera 系統具有 IsOpaque
屬性 。
CoreServices.CameraSystem.IsOpaque;
相機設定
無論您開發何種體驗,主要相機一律是附加至裝置前端顯示器的主要立體轉譯元件。 如果您想像使用者 (X: 0、Y: 0、Z: 0) 開始位置,則配置您的應用程式會比較容易。 由於主要相機是追蹤使用者頭部的移動,因此可以藉由設定主要相機的開始位置來設定使用者的開始位置。
您需要進行的核心選擇是您要針對 HoloLens 或 VR 沉浸式頭戴裝置進行開發。 取得之後,請跳至套用的安裝區段。
HoloLens 相機設定
針對 HoloLens 應用程式,您必須針對想要鎖定場景環境的任何物件使用錨點。 我們建議使用未系結的空間,將穩定性最大化,並在多個會議室中建立錨點。
請遵循本逐步教學課程 ,在 Unity 專案中新增並自動設定Mixed Reality工具組。 您也可以直接從 MRTK for Unity 使用 MixedRealityPlayspace 類別,並將 目標調整 設定為 World :
MRTK 應該會自動處理播放空間和相機的位置,但最好再次檢查:
從 [ 階層] 面板,展開 MixedRealityPlayspace GameObject 並尋找 Main Camera 子物件
在 [ 偵測器 ] 面板中,尋找 [轉換 ] 元件,並將 [位置 ] 變更為 (X: 0、Y: 0、Z: 0)
在 XRInputSubsystem 上設定追蹤原點模式。 取得子系統之後,呼叫 TrySetTrackingOriginMode :
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Device);
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Unbounded); // Recommendation for OpenXR
您可以針對 HoloLens 應用程式使用 ARSession ,其適用于錨點和 ARKit/ARCore。
重要
AR 會話和相關功能需要安裝 AR Foundation。
您也可以手動套用相機變更,而不使用 ARSession:
在[階層 ] 面板中選取[主要相機 ]
在 [ 偵測器 ] 面板中,尋找 [轉換 ] 元件,並將 [位置 ] 變更為 (X: 0、Y: 0、Z: 0)
Unity 中 [偵測器] 窗格中的相機
將 TrackedPoseDriver 新增至 主要相機
在[階層 ] 面板中選取[主要相機 ]
在 [ 偵測器 ] 面板中,尋找 [轉換 ] 元件,並將 [位置 ] 變更為 (X: 0、Y: 0、Z: 0)
Unity 中 [偵測器] 窗格中的相機
移至Windows 市集播放機設定 的其他設定 區段
選擇[Windows Mixed Reality ] 作為裝置,該裝置可能會在舊版 Unity 中列為Windows 全像攝影
選取 支援的 [虛擬實境]
由於主要相機物件會自動標記為相機,因此 Unity 會提供所有移動和翻譯功能。
注意
這些設定必須套用至應用程式中每個場景的相機。
根據預設,當您在 Unity 中建立新的場景時,它會在階層中包含包含相機元件的 Main Camera GameObject,但可能未正確套用設定。
VR 相機設定
Windows Mixed Reality支援各種體驗規模 的應用程式,從僅限方向和基座調整應用程式到會議室規模應用程式。 在 HoloLens 上,您可以進一步並建置全球規模應用程式,讓使用者流覽超過 5 公尺的建築物和更新版本。
在 Unity 中建置混合實境體驗的第一個步驟是判斷您的應用程式將鎖定哪些 體驗 規模:
會議室規模或常設體驗
使用適用于 Unity 的 MRTK 的 MixedRealityPlayspace 類別,並將 [目標調整 ] 設定為 [會議室 ] 或 [ 常設 ]:
MRTK 應該會自動處理播放空間和相機的位置,但最好再次檢查:
從 [ 階層] 面板,展開 MixedRealityPlayspace GameObject 並尋找 Main Camera 子物件
在 [ 偵測器 ] 面板中,尋找 [轉換 ] 元件,並將 [位置 ] 變更為 (X: 0、Y: 0、Z: 0)
移至Windows 市集播放機設定 的其他設定 區段
選擇[Windows Mixed Reality ] 作為裝置,該裝置可能會在舊版 Unity 中列為Windows 全像攝影
選取 支援的 [虛擬實境]
由於主要相機物件會自動標記為相機,因此 Unity 會提供所有移動和翻譯功能。
注意
這些設定必須套用至應用程式中每個場景的相機。
根據預設,當您在 Unity 中建立新的場景時,它會在階層中包含包含相機元件的主要 Camera GameObject,但未正確套用下列設定。
Namespace: UnityEngine.XR
Type: XRDevice
若要獲得 常設規模 或 會議室規模體驗 ,您必須將內容放在相對於樓層。 您使用 空間階段 來決定使用者樓層的原因,此階段代表使用者在初次執行期間所定義的樓層層級原點和選擇性會議室界限。
若要確保 Unity 在樓層層級使用其全局座標系統運作,您可以設定及測試 Unity 是否使用 RoomScale 追蹤空間類型:
if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
// RoomScale mode was set successfully. App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
// RoomScale mode was not set successfully. App cannot make assumptions about where the floor plane is.
}
如果 SetTrackingSpaceType 傳回 true,Unity 已成功切換其全局座標系統來追蹤 參考的階段框架 。
如果 SetTrackingSpaceType 傳回 false,Unity 就無法切換至參考階段框架,可能是因為使用者尚未在其環境中設定樓層。 雖然 false 傳回值並不常見,但如果階段是在不同的會議室中設定,但裝置會移至目前的會議室,而不會讓使用者設定新的階段,就會發生此情況。
一旦您的應用程式成功設定 RoomScale 追蹤空間類型,y=0 平面上放置的內容會出現在樓層上。 位於 0、0、0、0 的原點將會是使用者在會議室設定期間所在的樓層特定位置,而 -Z 代表他們在安裝期間所面對的正向方向。
基座體驗
使用適用于 Unity 的 MRTK 的 MixedRealityPlayspace 類別,並將 [目標調整 ] 設定為 Seated :
MRTK 應該會自動處理播放空間和相機的位置,但最好再次檢查:
從 [ 階層] 面板,展開 MixedRealityPlayspace GameObject 並尋找 Main Camera 子物件
在 [ 偵測器 ] 面板中,尋找 [轉換 ] 元件,並將 [位置 ] 變更為 (X: 0、Y: 0、Z: 0)
移至Windows 市集播放機設定 的其他設定 區段
選擇[Windows Mixed Reality ] 作為裝置,該裝置可能會在舊版 Unity 中列為Windows 全像攝影
選取 支援的 [虛擬實境]
由於主要相機物件會自動標記為相機,因此 Unity 會提供所有移動和翻譯功能。
注意
這些設定必須套用至應用程式中每個場景的相機。
根據預設,當您在 Unity 中建立新的場景時,它會在階層中包含包含相機元件的主要 Camera GameObject,但未正確套用下列設定。
Namespace: UnityEngine.XR
Type: XRDevice
若要建置 僅限方向 或 基座縮放體驗 ,您必須將 Unity 設定為固定追蹤空間類型。 固定追蹤空間會設定 Unity 的全球座標系統,以追蹤 固定的參考框架 。 在固定追蹤模式中,位於相機預設位置前方 (前方的內容為 -Z) 會在應用程式啟動時出現在使用者前面。
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
Namespace: UnityEngine.XR
Type: InputTracking
針對純 方向體驗 ,例如 360 度視訊檢視器, (位置前端更新會破壞假像) ,然後您可以設定 XR。InputTracking.disablePositionalTracking 為 true:
InputTracking.disablePositionalTracking = true;
如需 基座調整體驗 ,若要讓使用者稍後使用基座的來源,您可以呼叫 XR。InputTracking.Recenter 方法:
InputTracking.Recenter();
如果您要建置 基座規模體驗 ,您可以藉由呼叫 XR,在使用者目前的前端位置上,建立較新的 Unity 世界原點 。InputTracking.Recenter 方法。
設定相機背景
如果您使用 MRTK,則會自動設定及管理相機的背景。 針對 XR SDK 或舊版 WSA 專案,我們建議將相機的背景設定為 HoloLens 上的純黑色,並保留適用于 VR 的 skybox。
使用多個相機
當場景中有多個相機元件時,Unity 會根據 GameObject 具有 MainCamera 標籤來知道要用於身歷聲轉譯的相機。 在舊版 XR 中,它也會使用此標籤來同步處理前端追蹤。 在 XR SDK 中,頭部追蹤是由附加至相機的 TrackedPoseDriver 腳本所驅動。
共用深度緩衝區
根據您要轉譯的頭戴式裝置類型,將應用程式的深度緩衝區共用至 Windows 每個畫面都會提供全像投影穩定性中兩個提升的其中一個提升:
當提供深度緩衝區時,VR 沉浸式頭戴裝置 可以處理位置重現,以調整全像投影,以在位置和方向中調整您的全像投影來呈現錯誤。
HoloLens 頭戴式裝置 有一些不同的方法。 HoloLens 1 會在提供深度緩衝區時自動選取 焦點 ,並將全像投影穩定性與最內容交集的平面優化。 HoloLens 2會使用深度 LSR (穩定內容,請參閱) 。
MRTK 的設定對話方塊 會嘗試設定 XR SDK 和舊版 WSA 的深度緩衝區設定,但最好檢查這些索引標籤,並在 Unity 中驗證設定。
若要設定 Unity 應用程式是否會為 Windows 提供深度緩衝區:
移至[編輯 >專案設定 >XR 外掛程式管理 ],並確定功能表項目已展開。
按一下對應至所選 XR 執行時間的功能表項目,Windows Mixed Reality或 OpenXR。 此外,請確定已選取正確的組建平臺,因為 Windows 獨立版和通用 Windows 平臺都有可用的索引標籤。
若要啟用和設定:
針對 OpenXR,在 [ 深度提交模式 ] 下拉式清單中選取深度格式或 [無]。
針對Windows Mixed Reality,核取或取消核取[共用深度緩衝區 ] 核取方塊。 然後,從 [ 深度緩衝區格式 ] 下拉式清單中選取格式。
注意
通常建議使用 16 位深度緩衝區來改善效能。 不過,如果使用 16 位深度格式,樣板緩衝區所需的效果 (像是某些 Unity UI 捲動面板) 將無法運作,因為 Unity 不會在此設定中 建立樣板緩衝區 。 如果端點圖形平台上適用,則選取 24 位深度格式 通常會建立 8 位樣板緩衝區 。
若要設定 Unity 應用程式是否會為 Windows 提供深度緩衝區:
移至[編輯 >專案設定 >播放機 >通用 Windows 平臺索引標籤 >XR 設定 ]。
展開Windows Mixed Reality SDK 專案。
核取或取消核取 [ 啟用深度緩衝區共用] 核取方塊。 在新專案中預設會核取 [深度緩衝區共用],但較舊專案中預設可能未核取。
深度緩衝區可以改善視覺品質,只要 Windows 可以精確地將深度緩衝區中的標準化每圖元深度值對應回公尺的距離,使用您在主要相機上于 Unity 中設定的接近和遠平面。 如果您的轉譯會以一般方式處理深度值,您通常應該在這裡處理,不過半透明轉譯會將寫入深度緩衝區,同時顯示到現有的色彩圖元可能會混淆重現。 如果您知道轉譯階段會留下許多最終深度圖元的深度值不正確,您可能會取消核取 [啟用深度緩衝區共用] 以取得更好的視覺品質。
注意
通常建議使用 16 位深度緩衝區來改善效能。 不過,如果使用 16 位深度格式,樣板緩衝區所需的效果 (像是某些 Unity UI 捲動面板) 將無法運作,因為 Unity 不會在此設定中 建立樣板緩衝區 。 如果端點圖形平台上適用,則選取 24 位深度格式 通常會建立 8 位樣板緩衝區 。
使用裁剪平面
轉譯內容太接近使用者,在混合實境中可能很不方便。 您可以在相機元件上調整 近距裁剪平面 。
在[階層 ] 面板中選取[主要相機 ]
在 [偵測器 ] 面板中,尋找 相機 元件 裁剪平面 ,並將 [ 接近 ] 文字方塊從 0.3 變更為 0.85 。 更接近轉譯的內容可能會導致使用者感到不適,而且應該根據 轉譯距離指導方針 來避免。
最近使用相機
如果您要建置 基座規模體驗 ,您可以藉由呼叫 XR,在使用者目前的前端位置上,建立較新的 Unity 世界原點 。舊版 XR 中的 InputTracking.Recenter 方法,或 XR SDK 中的 XRInputSubsystem.TryRecenter 方法。
遙傳
這項功能通常保留給 VR 體驗:
MRTK 提供內建 的電話傳送系統 ,可自動跨已表達的手部和控制器運作。
我們建議使用 MRTK 的遠端傳送實作。
如果您選擇不使用 MRTK,Unity 會在 XR 互動工具組中 提供遠端傳送實作。
如果您選擇實作自己的,最好記得您無法直接移動相機。 由於 Unity 控制頭部追蹤的相機,您必須提供相機階層中的父代,並改為移動該 GameObject。 這相當於 MRTK 的 Playspace。
我們建議使用 MRTK 的遠端傳送實作。
如果您選擇實作自己的,最好記得您無法直接移動相機。 由於 Unity 控制頭部追蹤的相機,您必須提供相機階層中的父代,並改為移動該 GameObject。 這相當於 MRTK 的 Playspace。
重現模式
HoloLens 和沈浸式頭戴式裝置都會重新投影您的應用程式轉譯的每個畫面,以在發出光子時調整使用者實際頭部位置的任何錯誤。
依照預設:
如果應用程式為指定的畫面提供深度緩衝區,VR 沉浸式頭戴裝置 會負責位置重現。 沉浸式頭戴裝置也會調整全像投影,以在位置和方向中誤判。 如果未提供深度緩衝區,則系統只會以方向更正錯誤。
HoloLens 2之類的全像攝影頭戴式裝置 會處理應用程式是否提供其深度緩衝區的位置重現。 在 HoloLens 上,不需要深度緩衝區即可進行位置重現,因為轉譯通常是使用真實世界提供的穩定背景疏鬆。
MRTK 目前沒有重現模式的協助程式。 如需詳細資訊,請參閱其他其中一個索引標籤。
下一個開發檢查點
如果您遵循我們配置的 Unity 開發旅程,您正在探索 MRTK 核心建置組塊。 接下來,您可以繼續進行下一個建置組塊:
或者,直接跳到混合實境平台功能和 API 的主題:
您可以隨時回到 Unity 開發檢查點 。
另請參閱