Sdílet prostřednictvím


Souřadnicové systémy v Unity

Windows Mixed Reality podporuje aplikace napříč širokou škálou prostředí, od aplikací jen pro orientaci a sesazených aplikací směrem nahoru prostřednictvím aplikací na úrovni místnosti. Na HoloLensu můžete pokračovat a vytvářet aplikace ve velkém měřítku, které uživatelům umožňují chodit po 5 metrech a zkoumat celé patro budovy a dál.

Prvním krokem při vytváření prostředí hybridní reality v Unity je pochopení souřadnicových systémů a volba škálování prostředí, na které bude vaše aplikace cílit.

Vytvoření prostředí jen pro orientaci nebo sesaděné

Obor názvů: UnityEngine.XR
Typ: XRDevice

Chcete-li vytvořit prostředí pouze pro orientaci nebo sesaděné měřítko, je nutné nastavit Unity na typ prostoru pro sledování statického sledování. Statický sledovací prostor nastavuje světovou souřadnicovou soustavu Unity pro sledování statického rámce odkazu. V režimu statického sledování se obsah umístěný v editoru přímo před výchozím umístěním kamery (vpřed je -Z) zobrazí před uživatelem při spuštění aplikace.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Obor názvů: UnityEngine.XR
Typ: InputTracking

Pro čistě orientaci pouze zážitek , jako je 360stupňový video viewer (kde by poziční hlava aktualizace by zničila iluzi), můžete pak nastavit XR. InputTracking.disablePositionalTracking na true:

InputTracking.disablePositionalTracking = true;

V případě prostředí sesaděného prostředí můžete později nechat uživatele, aby se později vysadí sedělí původ, můžete volat XR. Metoda InputTracking.Recenter :

InputTracking.Recenter();

Vytvoření stálého prostředí nebo prostředí na úrovni místnosti

Obor názvů: UnityEngine.XR
Typ: XRDevice

Pokud chcete mít zkušenosti s trvalým nebo prostorovým měřítkem, budete muset umístit obsah vzhledem k podlaze. Důvodem je prostorová fáze uživatele, která představuje definovaný původ na úrovni podlahy uživatele a volitelnou hranici místnosti nastavenou při prvním spuštění.

Pokud chcete zajistit, aby Unity fungovala se svým světovým souřadnicovým systémem na úrovni podlahy, můžete nastavit a otestovat, že Unity používá typ prostoru sledování 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.
}
  • Pokud SetTrackingSpaceType vrátí hodnotu true, Unity úspěšně přepnula svůj světový souřadnicový systém ke sledování rámce fáze odkazu.
  • Pokud SetTrackingSpaceType vrátí hodnotu false, Unity nemohla přepnout na rámeček fáze odkazu, pravděpodobně proto, že uživatel ve svém prostředí nenastavil podlahu. I když nepravdivá návratová hodnota není běžná, může k tomu dojít v případě, že je fáze nastavená v jiné místnosti a zařízení se přesune do aktuální místnosti bez nastavení nové fáze.

Jakmile aplikace úspěšně nastaví typ prostoru sledování RoomScale, zobrazí se obsah umístěný na rovině y=0 na podlaze. Původ na 0, 0, 0 bude specifické místo na podlaze, kde uživatel stál během nastavování místnosti, a -Z představující směr dopředu, ke kterému došlo během nastavení.

Obor názvů: UnityEngine.Experimental.XR
Typ: Hranice

V kódu skriptu pak můžete volat TryGetGeometry metoda na UnityEngine.Experimental.XR.Boundary typ získat hraniční mnohoúhelník určující typ hranice TrackedArea. Pokud uživatel definoval hranici (vrátíte seznam vrcholů), je bezpečné poskytnout uživateli prostředí na úrovni místnosti, kde může procházet scénu, kterou vytvoříte.

Poznámka:

Systém automaticky vykreslí hranici, když se k ní uživatel přiblíží. Aplikace nepotřebuje k vykreslení samotné hranice používat tento mnohoúhelník. Můžete se ale rozhodnout, že objekty scény rozložíte pomocí tohoto mnohoúhelníku hranic, aby se uživatel k těmto objektům fyzicky dostal bez teleportování:

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.
}

Vytvoření prostředí na světě

Obor názvů: UnityEngine.XR.WSA
Typ: WorldAnchor

V případě skutečných prostředí na HoloLensu , které uživatelům umožňují procházet více než 5 metrů, budete potřebovat nové techniky nad rámec těch, které se používají pro prostředí v místnosti. Jednou z klíčových technik, kterou použijete, je vytvoření prostorového ukotvení pro zamknutí clusteru hologramů přesně na místě ve fyzickém světě, bez ohledu na to, jak daleko uživatel přešel, a pak tyto hologramy znovu najít v pozdějších relacích.

V Unity vytvoříte prostorové ukotvení přidáním komponenty WorldAnchor Unity do Objektu GameObject.

Přidání ukotvení světa

Pokud chcete přidat světovou kotvu, zavolejte AddComponent<WorldAnchor>() na herní objekt s transformací, kterou chcete ukotvení ve skutečném světě.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

A je to! Tento herní objekt bude nyní ukotven k jeho aktuálnímu umístění ve fyzickém světě - můžete vidět, že jeho souřadnice světa Unity se v průběhu času upraví mírně, aby se zajistilo fyzické zarovnání. Pomocí trvalosti najděte toto ukotvené umístění znovu v budoucí relaci aplikace.

Odebrání ukotvení světa

Pokud už nechcete, aby objekt GameObject byl uzamčený na fyzickém světě a nemá v úmyslu ho přesunout do tohoto rámce, můžete jednoduše volat Destroy na komponentě World Anchor.

Destroy(gameObject.GetComponent<WorldAnchor>());

Pokud chcete přesunout GameObject tento rámec, musíte místo toho volat DestroyImmediate.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

Přesunutí objektu GameObject ukotveného světem

Objekt GameObject nelze přesunout, pokud je na něm světová kotva. Pokud potřebujete přesunout GameObject tento rámec, musíte:

  1. DestroyImmediate komponenta World Anchor
  2. Přesunutí objektu GameObject
  3. Přidejte do Objektu GameObject novou komponentu World Anchor.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Zpracování změn lokatability

WorldAnchor nemusí být lokovatelný ve fyzickém světě v určitém okamžiku. Pokud k tomu dojde, Unity nebude aktualizovat transformaci ukotveného objektu. To se také může změnit, když je aplikace spuštěná. Selhání zpracování změny v lokatelnosti způsobí, že se objekt nezobrazí ve správném fyzickém umístění na světě.

Oznámení o změnách lokability:

  1. Přihlášení k odběru události OnTrackingChanged
  2. Zpracování události

Událost OnTrackingChanged bude volána vždy, když se podkladové prostorové ukotvení změní mezi stavem lokovatelného a nelokovatelného.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Pak zpracujte událost:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
    // This simply activates/deactivates this object and all children when tracking changes
    self.gameObject.SetActiveRecursively(located);
}

Někdy se kotvy nacházejí okamžitě. V tomto případě bude tato vlastnost isLocated ukotvení nastavena na true při AddComponent<WorldAnchor>() vrátí. V důsledku toho se událost OnTrackingChanged neaktivuje. Čistým vzorem by bylo volání obslužné rutiny OnTrackingChanged s počátečním stavem IsLocated po připojení ukotvení.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Sdílení ukotvení napříč zařízeními

Azure Spatial Anchors můžete použít k vytvoření odolného cloudového ukotvení z místního worldAnchoru, který vaše aplikace pak může najít na několika zařízeních s HoloLens, iOSem a Androidem. Sdílením společného prostorového ukotvení napříč několika zařízeními může každý uživatel zobrazit obsah vykreslený vzhledem k této ukotvení ve stejném fyzickém umístění. To umožňuje sdílené prostředí v reálném čase.

Pokud chcete začít vytvářet sdílená prostředí v Unity, vyzkoušejte si 5minutové rychlé starty Azure Spatial Anchors Unity.

Jakmile budete s Azure Spatial Anchors v provozu, můžete vytvořit a vyhledat ukotvení v Unity.

Kontrolní bod dalšího vývoje

Pokud sledujete cestu kontrolního bodu vývoje Unity, kterou jsme probrali, jste uprostřed zkoumání základních stavebních bloků hybridní reality. Odtud můžete pokračovat k dalšímu stavebnímu bloku:

Nebo přejděte na možnosti platformy a rozhraní API hybridní reality:

Kdykoli se můžete vrátit k kontrolním bodům vývoje Unity.

Viz také