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:
- DestroyImmediate komponentu World Anchor
- Přesunutí objektu GameObject
- 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:
- Přihlášení k odběru události OnTrackingChanged
- 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.