Unity 中的座標系統

Windows Mixed Reality支援各種體驗規模的應用程式,從僅限方向和基座調整應用程式到會議室規模應用程式。 在 HoloLens 上,您可以進一步並建置全球規模應用程式,讓使用者流覽超過 5 公尺的建築物和更新版本。

在 Unity 中建置混合實境體驗的第一個步驟是瞭解 座標系統,然後選擇應用程式的目標體驗規模

建置僅限方向或基座的縮放體驗

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();

建置常設規模或會議室規模體驗

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 代表他們在安裝期間所面對的正向方向。

Namespace:UnityEngine.Experimental.XR
Type:Boundary

在腳本程式碼中,您可以接著在 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.
}

建置全球規模體驗

Namespace:UnityEngine.XR.WSA
Type: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

當 World Anchor 位於遊戲錨點時,無法移動 GameObject。 如果您需要移動 GameObject 此框架,您需要:

  1. DestroyImmediate World Anchor 元件
  2. 移動 GameObject
  3. 將新的 World Anchor 元件新增至 GameObject。
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

處理 Locatability 變更

WorldAnchor 可能無法在實體世界中一次取得。 如果發生這種情況,Unity 將不會更新錨定物件的轉換。 這也可以在應用程式執行時變更。 無法處理 locatability 中的變更會導致物件不會出現在世界的正確實體位置。

若要收到有關 locatability 變更的通知:

  1. 訂閱 OnTrackingChanged 事件
  2. 處理事件

每當基礎空間錨點在可 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 開發檢查點旅程,您正在探索Mixed Reality核心建置組塊。 接下來,您可以繼續進行下一個建置組塊:

或者,直接跳到混合實境平台功能和 API 的主題:

您可以隨時回到 Unity 開發檢查點

另請參閱