Unity 中的座標系統
Windows Mixed Reality 支援各種體驗規模的應用程式,從僅限方向和固定規模的應用程式,到室內規模應用程式。 在 HoloLens 上,您可以進一步建置世界規模的應用程式,讓使用者步行超過 5 公尺,探索建築物的整個樓層和更新版本。
在 Unity 中建置混合實境體驗的第一個步驟是瞭解 座標系統,並選擇應用程式的目標體驗規模 。
建置僅限方向或座位規模的體驗
命名空間: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();
建置常設規模或會議室規模體驗
命名空間: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 代表他們在安裝期間所面對的前進方向。
命名空間:UnityEngine.Experimental.XR
類型:界限
在腳本程式代碼中,您可以接著在 UnityEngine.Experimental.XR.Boundary 類型上呼叫 TryGetGeometry 方法,以取得界限多邊形,並指定 TrackedArea 的界限類型。 如果使用者定義了界限(您可以返回頂點清單),則安全地將空間規模體驗傳遞給用戶,他們可以在您所建立的場景中四處走動。
注意
當使用者接近界限時,系統會自動轉譯界限。 您的應用程式不需要使用此多邊形來轉譯界限本身。 不過,您可以選擇使用此界限多邊形配置場景物件,以確保使用者可以實際連線到這些物件,而不需傳送:
var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
// Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}
建置世界規模體驗
命名空間:UnityEngine.XR.WSA
類型:WorldAnchor
對於 HoloLens 上真正的 世界規模體驗 ,讓使用者在 5 公尺以上徘徊,您將需要超越用於室內規模體驗的新技術。 您將使用的其中一 個關鍵技巧是建立空間錨點 ,以鎖定實體世界中精確就地放置的全像投影叢集,無論使用者漫遊了多遠,然後在 稍後的會話中再次找到這些全像投影。
在 Unity 中,您會將 WorldAnchor Unity 元件新增至 GameObject 來建立空間錨點。
新增世界錨點
若要新增世界錨點,請在遊戲物件上呼叫 AddComponent<WorldAnchor>(),並搭配您想要在真實世界中錨定的轉換。
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
介紹完畢 此遊戲對象現在會錨定在實體世界中的目前位置,您可能會看到其 Unity 世界座標會隨著時間稍微調整,以確保實體對齊。 在未來的應用程式會話中,使用 持續性 再次尋找此錨定位置。
拿掉世界錨點
如果您不想再將 GameObject 鎖定到實體世界位置,而且不想移動此框架,則您可以直接在 World Anchor 元件上呼叫 Destroy。
Destroy(gameObject.GetComponent<WorldAnchor>());
如果您想要移動 GameObject 此畫面,您必須改為呼叫 DestroyImmediate。
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
移動世界錨定 GameObject
當世界錨點在它上時,GameObject 無法移動。 如果您需要移動 GameObject 此畫面,您需要:
- DestroyImmediate The World Anchor component
- 移動 GameObject
- 將新的 World Anchor 元件新增至 GameObject。
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
處理 Locatability 變更
在物理世界中,在某個時間點,WorldAnchor 可能無法被取代。 如果發生這種情況,Unity 將不會更新錨定對象的轉換。 這也可以在應用程式執行時變更。 無法處理locatability變更會導致物件不會出現在世界上正確的實體位置。
若要收到關於可擷取性變更的通知:
- 訂閱 OnTrackingChanged 事件
- 處理事件
每當基礎空間錨點的狀態變更為可locatable與無法擷取時,都會呼叫 OnTrackingChanged 事件。
anchor.OnTrackingChanged += Anchor_OnTrackingChanged;
然後處理事件:
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
有時候錨點會立即找到。 在此情況下,當 AddComponent<WorldAnchor>() 傳回時,錨點的 isLocated 屬性會設定為 true。 因此,將不會觸發 OnTrackingChanged 事件。 全新的模式是在附加錨點之後,使用初始 IsLocated 狀態呼叫 OnTrackingChanged 處理程式。
Anchor_OnTrackingChanged(anchor, anchor.isLocated);
跨裝置共用錨點
使用 Azure Spatial Anchors 從本機 WorldAnchor 建立持久的雲端錨點,您的應用程式接著可以在多個 HoloLens、iOS 和 Android 裝置中找到此錨點。 藉由跨多個裝置共用通用空間錨點,每個使用者都可以在相同實體位置看到相對於該錨點轉譯的內容。 這可提供即時共用體驗。
若要開始在 Unity 中建置共享體驗,請嘗試 5 分鐘的 Azure Spatial Anchors Unity 快速入門。
使用 Azure Spatial Anchors 啟動並執行之後,您就可以 在 Unity 中建立並尋找錨點。
下一個開發檢查點
如果您遵循我們制定的 Unity 開發檢查點旅程,您正在探索混合實境核心建置組塊。 接下來,您可以繼續進行下一個建置組塊:
或者,直接跳到混合實境平台功能和 API 的主題:
您可以隨時回到 Unity 開發檢查點。