Souřadnicové systémy v Unity

Windows Mixed Reality podporuje aplikace v široké škále prostředí, od aplikací pouze s orientací a s možností škálování vsedě až po aplikace na úrovni místnosti. Na HoloLensu můžete jít dál a vytvářet aplikace ve světovém měřítku, které uživatelům umožňují jít přes 5 metrů, prozkoumat celé patro budovy a dál.

Vaším prvním krokem při vytváření prostředí hybridní reality v Unity je porozumět souřadnicovým systémům a zvolit škálování prostředí , na které bude vaše aplikace cílit.

Vytváření prostředí jen pro orientaci nebo v sesedách

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

Pokud chcete vytvořit prostředí jen s orientací nebo sedem, musíte Unity nastavit na typ statického prostoru pro sledování. Stabilní sledování prostoru nastavuje souřadnicový systém Unity pro sledování nehybného referenčního rámce. V režimu statického sledování se obsah umístěný v editoru přímo před výchozí polohou fotoaparátu (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ě orientační prostředí , jako je například 360stupňový video prohlížeč (kde by aktualizace poziční hlavy zničila iluzi), můžete nastavit XR. InputTracking.disablePositionalTracking na hodnotu true:

InputTracking.disablePositionalTracking = true;

Pro prostředí v sesedě, abyste uživateli později umožnili, aby později aktualizoval seed origin, můžete volat XR. Metoda InputTracking.Recenter :

InputTracking.Recenter();

Vytvoření stálého nebo prostorového prostředí

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

Pro prostředí v měřítku ve stoje nebo v měřítku místnosti budete muset umístit obsah vzhledem k podlaze. K odůvodnění podlahy uživatele použijete prostorovou fázi, která představuje uživatelem definovaný počátek na úrovni podlahy a volitelné ohraničení místnosti nastavené během prvního běhu.

Pokud chcete zajistit, aby Unity pracovala se svým souřadnicovým systémem světa na úrovni podlahy, můžete nastavit a otestovat, že Unity používá sledovací prostor typu 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řepnul svůj souřadnicový systém world ke sledování referenčního rámce fáze.
  • Pokud SetTrackingSpaceType vrátí hodnotu false, Unity nemohl přepnout na referenční rámec fáze, pravděpodobně proto, že uživatel nenastavil podlahu ve svém prostředí. I když návratová hodnota false není běžná, může k tomu dojít, pokud je fáze nastavená v jiné místnosti a zařízení se přesune do aktuální místnosti, aniž by uživatel nastavil novou fázi.

Jakmile aplikace úspěšně nastaví typ prostoru pro sledování úrovně RoomScale, obsah umístěný v rovině y=0 se zobrazí na podlaze. Počátek 0, 0, 0 bude konkrétním místem v patře, kde uživatel stál během nastavování místnosti, přičemž -Z představuje směr dopředu, kterým byl při nastavování.

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čení typ hranice TrackedArea. Pokud uživatel definoval hranici (dostanete zpátky seznam vrcholů), je bezpečné poskytnout uživateli prostředí v měřítku 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 nemusí tento mnohoúhelník používat k vykreslení samotné hranice. Můžete se ale rozhodnout, že objekty scény rozložíte pomocí tohoto hraničního mnohoúhelníku, abyste zajistili, že se uživatel k těmto objektům fyzicky dostane 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.
}

Vytváření prostředí ve světovém měřítku

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

Pro skutečné prostředí v celosvětovém měřítku na HoloLensu, které uživatelům umožňují přecházet přes 5 metrů, budete potřebovat nové techniky, které se nepoužívají pro prostředí v místnosti. Jednou z klíčových technik, kterou použijete, je vytvoření prostorové kotvy , která uzamkne shluk hologramů přesně na místě ve fyzickém světě bez ohledu na to, jak daleko se uživatel dostal, a pak tyto hologramy znovu najdete v dalších relacích.

V Unity vytvoříte prostorovou kotvu přidáním komponenty WorldAnchor Unity do objektu GameObject.

Přidání ukotvení světa

Pokud chcete přidat kotvu světa, volejte metodu AddComponent<WorldAnchor>() u herního objektu s transformací, kterou chcete ukotvit v reálném světě.

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

A to je vše! Tento herní objekt bude nyní ukotven na svém aktuálním místě ve fyzickém světě – jeho souřadnice světa Unity se v průběhu času mírně upravují, aby se zajistilo fyzické zarovnání. Trvalost použijte k opětovnému vyhledání tohoto ukotveného umístění v budoucí relaci aplikace.

Odebrání ukotvení světa

Pokud už nechcete, aby objekt GameObject byl uzamčen na fyzickém místě světa a nechcete ho tímto rámečkem přesunout, můžete jen 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 s ukotveným světem

Objekty GameObject nelze přesunout, pokud je na něm kotva světa. Pokud potřebujete přesunout GameObject o tento snímek, musíte:

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

Zpracování změn lokalizovatelnosti

Funkce WorldAnchor nemusí být vyhledatelná 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á. Nezvládnutí změny v lokalizovatelnosti způsobí, že se objekt nezobrazí ve správném fyzickém umístění na světě.

Upozornění na změny lokalizovatelnosti:

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

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

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Pak událost zpracujte:

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, když 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í mezi zařízeními

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

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

Jakmile službu Azure Spatial Anchors zprovozníte, můžete vytvářet a vyhledávat kotvy v Unity.

Další vývojový kontrolní bod

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

Nebo přejděte na Mixed Reality možností platformy a rozhraní API:

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

Viz také