Unity 中的相機設定
本文內容
當您戴著混合實境頭戴式裝置時,它會成為全像攝影世界的中心。 Unity 相機 元件會自動處理立體轉譯,並遵循您的頭部移動和旋轉。 不過,若要完全優化視覺品質和 全像投影穩定性 ,您應該設定以下所述的相機設定。
HoloLens 與VR沉浸式頭戴式裝置
Unity 相機元件上的預設設定適用於傳統 3D 應用程式,其需要類似 skybox 的背景,因為它們沒有真實世界。
在沉浸式頭戴式裝置上 執行時,您會轉譯使用者所看到的一切,因此您可能會想要保留 skybox。
不過,在 HoloLens 等 全像攝影頭戴式裝置上 執行時,真實世界應該會出現在相機轉譯的所有項目後面。 將相機背景設定為透明(在 HoloLens 中,黑色呈現為透明),而不是 Skybox 紋理:
在 [階層] 面板中選取 [主要相機]
在 [偵測器] 面板中,尋找相機元件,並將 [清除旗標] 下拉式清單從 Skybox 變更為純色
選取背景色彩選擇器,並將 RGBA 值變更為 (0, 0, 0, 0)
如果從程式代碼設定此專案,您可以使用 Unity 的 Color.clear
MRTK 會根據 相機系統配置檔 中的組態,自動處理特定的相機設定。
命名空間: Microsoft.MixedReality.Toolkit.CameraSystem
類型: MixedRealityCameraSystem
若要檢查相機不透明,MixedRealityCamera 系統具有 IsOpaque
屬性 。
CoreServices.CameraSystem.IsOpaque;
觀景窗設定
無論您開發何種體驗,主要相機一律是連接到您裝置前端顯示器的主要立體聲轉譯元件。 如果您想像使用者的起始位置為 (X: 0, Y: 0, Z: 0), 您的應用程式會比較容易配置。 由於主相機是追蹤使用者頭部的移動,因此可以藉由設定主相機的起始位置來設定使用者的起始位置。
您需要做出的中央選擇是針對 HoloLens 或 VR 沉浸式頭戴式裝置進行開發。 完成之後,請跳至套用的設定區段。
HoloLens 相機設定
針對 HoloLens 應用程式,您必須針對想要鎖定場景環境的任何物件使用錨點。 我們建議使用未系結的空間,將穩定性最大化,並在多個會議室中建立錨點。
請遵循這個 逐步教學課程 ,在 Unity 專案中新增並自動設定混合實境工具組。 您也可以直接從適用於 Unity 的 MRTK 使用 MixedRealityPlayspace 類別,並將 [目標規模] 設定 為 [世界 ]:
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 全像攝影 版
選取 支援的 [虛擬實境]
由於Main Camera 物件會自動標記為相機,Unity 會提供所有行動和翻譯功能。
注意
這些設定必須套用至應用程式每個場景的相機。
根據預設,當您在 Unity 中建立新場景時,它會在階層中包含主相機 GameObject,其中包含相機元件,但可能未正確套用設定。
VR 相機設定
Windows Mixed Reality 支援各種 體驗規模的 應用程式,從僅限方向和固定規模的應用程式,到室內規模應用程式。 在 HoloLens 上,您可以進一步建置世界規模的應用程式,讓使用者步行超過 5 公尺,探索建築物的整個樓層和更新版本。
在 Unity 中建置混合實境體驗的第一個步驟,是判斷 您的應用程式的目標體驗規模 :
會議室規模或站立體驗
使用適用於 Unity 的 MRTK MixedRealityPlayspace 類別,並將 [目標級別] 設定 為 Room 或 Standing :
MRTK 應該自動處理遊戲空間和相機的位置,但最好仔細檢查:
從 [ 階層] 面板展開 MixedRealityPlayspace GameObject並尋找 Main Camera 子物件
在 [偵測器] 面板中,尋找 [轉換 ] 元件,並將 [位置] 變更 為 [X: 0,Y: 0,Z: 0]
移至 Windows 市集播放機設定的其他設定 區段
選擇 [Windows Mixed Reality ] 作為裝置,這可能在舊版 Unity 中列為 Windows 全像攝影 版
選取 支援的 [虛擬實境]
由於Main Camera 物件會自動標記為相機,Unity 會提供所有行動和翻譯功能。
注意
這些設定必須套用至應用程式每個場景的相機。
根據預設,當您在 Unity 中建立新場景時,它會在階層中包含主相機 GameObject,其中包含相機元件,但未正確套用下列設定。
命名空間: UnityEngine.XR
類型: 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 的原點將是使用者在房間安裝期間站在地板上的特定位置,-Z 代表他們在安裝期間所面對的前進方向。
座位體驗
使用適用於 Unity 的 MRTK MixedRealityPlayspace 類別,並將 [目標級別] 設定 為 Seated :
MRTK 應該自動處理遊戲空間和相機的位置,但最好仔細檢查:
從 [ 階層] 面板展開 MixedRealityPlayspace GameObject並尋找 Main Camera 子物件
在 [偵測器] 面板中,尋找 [轉換 ] 元件,並將 [位置] 變更 為 [X: 0,Y: 0,Z: 0]
移至 Windows 市集播放機設定的其他設定 區段
選擇 [Windows Mixed Reality ] 作為裝置,這可能在舊版 Unity 中列為 Windows 全像攝影 版
選取 支援的 [虛擬實境]
由於Main Camera 物件會自動標記為相機,Unity 會提供所有行動和翻譯功能。
注意
這些設定必須套用至應用程式每個場景的相機。
根據預設,當您在 Unity 中建立新場景時,它會在階層中包含主相機 GameObject,其中包含相機元件,但未正確套用下列設定。
命名空間: UnityEngine.XR
類型: XRDevice
若要建置 僅限 方向或 座位縮放體驗 ,您必須將 Unity 設定為固定追蹤空間類型。 固定追蹤空間會設定 Unity 的世界座標系統,以追蹤 靜止參考框架 。 在固定追蹤模式中,在相機預設位置(向前為 -Z)前方,放置在編輯器中的內容會在應用程式啟動時出現在使用者面前。
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
命名空間: UnityEngine.XR
類型: 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,讓 app 在全像投影穩定性中提供兩個提升的其中一個:
當提供深度緩衝區時,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 目前沒有重現模式的協助程式。 如需詳細資訊,請參閱其他索引標籤之一。
重新專案模式可透過將 XRDisplaySubsystem.reprojectionMode 設定 為適當的值來設定。
例如,如果您要使用固定主體鎖定內容來建置僅限方向的體驗 (例如 360 度視訊內容),您可以藉由將它設定為 ReprojectionMode.OrientationOnly,明確地將重新投影模式設定為 方向。
下一個開發檢查點
如果您遵循我們制定的 Unity 開發旅程,您正在探索 MRTK 核心建置組塊。 接下來,您可以繼續進行下一個建置組塊:
或者,直接跳到混合實境平台功能和 API 的主題:
您可以隨時回到 Unity 開發檢查點 。
另請參閱