Zajištění toho, aby hologramy zůstaly na svém místě, aby se pohybovaly s vámi nebo se v některých případech umístily vzhledem k jiným hologramům, je velkou součástí vytváření Mixed Reality aplikací. Tento článek vás provede doporučeným řešením pomocí nástrojů World Locking Tools, ale probereme také ruční nastavení prostorových ukotvení ve vašich projektech Unity. Než se pustíme do jakéhokoli kódu, je důležité pochopit, jak Unity zpracovává souřadnicový prostor a ukotvení ve vlastním modulu.
Souřadnicové systémy ve světovém měřítku
Při psaní her, aplikací pro vizualizaci dat nebo aplikací pro virtuální realitu je dnes typickým přístupem vytvoření jednoho absolutního souřadnicového systému světa , ke kterému se všechny ostatní souřadnice můžou spolehlivě namapovat. V takovém prostředí můžete vždy najít stabilní transformaci, která definuje vztah mezi libovolnými dvěma objekty v daném světě. Pokud byste tyto objekty nepřesunuli, jejich relativní transformace by vždy zůstaly stejné. Tento druh globálního souřadnicového systému je snadno použitelný při vykreslování čistě virtuálního světa, kde předem znáte veškerou geometrii. Aplikace VR v měřítku místností dnes obvykle vytvářejí tento druh absolutního souřadnicového systému v rozsahu místnosti se svým původem na podlaze.
Naproti tomu nepřipojené zařízení pro hybridní realitu, jako je HoloLens, má dynamické porozumění světu řízené senzory a průběžně upravuje své znalosti o okolí uživatele, když prochází mnoho metrů po celém patře budovy. Pokud byste ve světovém měřítku umístili všechny hologramy do naivního tuhého souřadnicového systému, tyto hologramy by se v průběhu času posunovaly, a to buď na základě světa, nebo by se vzájemně relativní.
Náhlavní souprava může například v současné době věřit, že dvě místa na světě jsou od sebe vzdálená 4 metry, a později toto porozumění upřesní a naučí se, že umístění jsou ve skutečnosti 3,9 metrů od sebe. Pokud by tyto hologramy byly původně umístěny 4 metry od sebe v jediném tuhém souřadnicovém systému, jeden z nich by se pak vždy objevil 0,1 m od skutečného světa.
Prostorové kotvy můžete v Unity umístit ručně, abyste zachovali pozici hologramu ve fyzickém světě, když je uživatel mobilní. To však obětuje samostatnou konzistenci ve virtuálním světě. Různé kotvy se neustále pohybují ve vztahu k sobě navzájem a také procházejí globálním souřadnicemi. V tomto scénáři jsou jednoduché úkoly, jako je rozložení, obtížné. Fyzikální simulace může být také problematická.
WLT (World Locking Tools ) vám poskytne to nejlepší z obou světů a stabilizuje jeden tuhý souřadnicový systém pomocí interní dodávky prostorových kotev rozprostřených po virtuální scéně při pohybu uživatele. WLT analyzuje souřadnice kamery a tyto prostorové kotvy na každém snímku. Místo změny souřadnic všeho na světě, aby se kompenzují opravy v souřadnicích hlavy uživatele, WLT místo toho pouze opravuje souřadnice hlavy.
Nástroje world locking tools poskytují stabilní souřadnicový systém, který minimalizuje viditelné nekonzistence mezi značkami virtuálního a reálného světa. Nástroje world Locking Tools uzamknou celou scénu se sdíleným fondem ukotvení, místo aby zamkly každou skupinu objektů s vlastním individuálním ukotvením skupiny.
World Locking Tools automaticky zpracovává interní vytváření a správu prostorových ukotvení. Nemusíte interagovat s ARAnchorManager nebo WorldAnchor, aby vaše hologramy zůstaly ve světě uzamčené.
Pro Unity 2019/2020 pomocí OpenXR nebo modulu plug-in Windows XR použijte ARAnchorManager.
Pro starší verze Unity nebo projekty WSA použijte WorldAnchor.
Pokud chcete začít používat nástroje World Locking Tools, stáhněte si nástroj Mixed Reality Feature Tool. Další informace o základech najdete na hlavní stránce dokumentace k nástrojům World Locking Tools, kde najdete odkazy na přehled, rychlý start a další užitečná témata.
Až bude projekt připravený, spusťte nástroj configure scene z Mixed Reality > World Locking Tools:
Důležité
Nástroj Konfigurovat scénu můžete kdykoli spustit znovu. Mělo by se například znovu spustit, pokud se cíl rozšířené rozšířené správy změnil ze starší verze na XR SDK. Pokud je scéna již správně nakonfigurovaná, nemá spuštění nástroje žádný vliv.
Vizualizéry
Během počátečního vývoje může být přidání vizualizérů užitečné, aby se zajistilo správné nastavení a fungování WLT. Je možné je odebrat z důvodu produkčního výkonu, nebo pokud už z nějakého důvodu nejsou potřeba, pomocí nástroje Odebrat vizualizéry. Další podrobnosti o vizualizérech najdete v dokumentaci k nástrojům.
Modul plug-in Mixed Reality OpenXR poskytuje základní funkce ukotvení prostřednictvím implementace ARFoundation ARAnchorManager v Unity. Základní informace o arAnchorech v ARFoundation najdete v příručce ARFoundation Pro Správce ukotvení AR.
Tento herní objekt je nyní ukotven na svém aktuálním místě ve fyzickém světě. Může se stát, že se její souřadnice světa Unity v průběhu času mírně upravují, aby se zajistilo fyzické zarovnání. Pokud chcete toto ukotvené umístění znovu najít v budoucí relaci aplikace, přečtěte si článek o načtení světové kotvy .
Odebrání ukotvení světa
Pokud už nechcete GameObject , aby byl uzamčený na fyzickém místě a nemáte v úmyslu tento rámec přesunout, zavolejte Destroy na komponentu World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Pokud chcete tento rámec přesunout GameObject , zavolejte DestroyImmediate místo toho.
Ukotvení světa nemusí být ve fyzickém světě v určitém okamžiku možné najít. Unity pak nebude aktualizovat transformaci ukotveného objektu. K této situaci může také dojít, 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řihlaste se k odběru OnTrackingChanged události. Událost je OnTrackingChanged volána vždy, když se podkladové prostorové ukotvení změní mezi stavem, že je lokatable nebo není lokatable.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Pokud jsou kotvy umístěny okamžitě, isLocated je vlastnost ukotvení nastavena na při AddComponent<WorldAnchor>()true návratu. Proto se OnTrackingChanged událost neaktivuje. Čistším vzorem je volání obslužné rutiny OnTrackingChanged s počátečním IsLocated stavem po připojení kotvy.
Prostorové kotvy šetří hologramy v reálném prostoru mezi relacemi aplikace. Po uložení v úložišti ukotvení HoloLens se prostorové kotvy dají najít a načíst v různých relacích a jsou ideální náhradní v případě, že není dostupné připojení k internetu.
Důležité
Místní ukotvení se ukládají na zařízení, zatímco Azure Spatial Anchors jsou uložené v cloudu. Místní kotvy a kotvy Azure můžete mít ve stejném projektu bez konfliktu. Další informace o integraci cloudových služeb Azure do ukládání ukotvení najdete v tématu Azure Spatial Anchors.
Nástroje world locking tools ve výchozím nastavení obnovují souřadnicový systém Unity vzhledem k fyzickému světu napříč relacemi na zařízeních, která podporují trvalost místních prostorových ukotvení. Aby se po ukončení a opětovném spuštění aplikace zobrazil hologram na stejném místě ve fyzickém světě, stačí, když aplikace obnoví stejnou pozici v hologramu.
Pokud aplikace potřebuje jemnější kontrolu, můžete v inspektoru zakázat automatické ukládání a automatické načítání a spravovat trvalost ze skriptu. Další informace najdete v tématu Zachování prostorových souřadnicových systémů.
Nástroje world locking tools podporují trvalost místního ukotvení pouze na zařízeních HoloLens. Pro zařízení s Androidem, iOSem a HoloLensem se integrujte se službou Azure Spatial Anchors, abyste podpořili trvalost a sdílení prostorů souřadnic mezi relacemi a zařízeními. Další informace a ukázky s využitím nástrojů World Locking Tools s Azure Spatial Anchors najdete v tématu WLT (World Locking Tools) v kombinaci s Azure Spatial Anchors (ASA).
Rozhraní API s názvem umožňuje XRAnchorStore zachovat ukotvení mezi relacemi. Jedná se XRAnchorStore o reprezentaci uložených ukotvení na zařízení. Ukotvení můžete zachovat ve ARAnchors scéně Unity, načíst kotvy z úložiště do nového ARAnchorsnebo je z úložiště odstranit.
Poznámka
Tyto kotvy uložíte a načtete na stejném zařízení. Ukotvení napříč zařízeními jsou podporována prostřednictvím azure Spatial Anchors.
Obory názvů
Pro Unity 2020 a OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
nebo Unity 2019/2020 + Modul plug-in XR pro Windows:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Veřejné metody
{
// A list of all persisted anchors, which can be loaded.
public IReadOnlyList<string> PersistedAnchorNames { get; }
// Clear all persisted anchors
public void Clear();
// Load a single persisted anchor by name. The ARAnchorManager will create this new anchor and report it in
// the ARAnchorManager.anchorsChanged event. The TrackableId returned here is the same TrackableId the
// ARAnchor will have when it is instantiated.
public TrackableId LoadAnchor(string name);
// Attempts to persist an existing ARAnchor with the given TrackableId to the local store. Returns true if
// the storage is successful, false otherwise.
public bool TryPersistAnchor(TrackableId id, string name);
// Removes a single persisted anchor from the anchor store. This will not affect any ARAnchors in the Unity
// scene, only the anchors in storage.
public void UnpersistAnchor(string name);
}
Získání odkazu na úložiště ukotvení
Pokud chcete načíst XRAnchorStore s Unity 2020 a OpenXR, použijte metodu rozšíření na XRAnchorSubsystem, subsystému ARAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Pokud chcete načíst XRAnchorStore s Unity 2019/2020 a modulem plug-in XR, použijte metodu rozšíření na XRReferencePointSubsystem (Unity 2019) nebo XRAnchorSubsystem (Unity 2020), subsystému ARReferencePointManager/ARAnchorManager:
// Unity 2019 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRReferencePointSubsystem anchorSubsystem);
// Unity 2020 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem);
Načtení úložiště ukotvení
Pokud chcete načíst úložiště ukotvení v Unity 2020 a OpenXR, přistupte k němu ze subsystému ARAnchorManager následujícím způsobem:
Pokud se chcete podívat na úplný příklad zachování nebo zrušení ukotvení, podívejte se na skripty Anchors -> Anchors Sample GameObject a AnchorsSample.cs v [Mixed Reality Ukázková scéna modulu plug-in OpenXR]():https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples
Pro trvalost hologramu ve starších verzích Unity nebo v projektech WSA použijte WorldAnchor.
Obor názvů:UnityEngine.XR.WSA.Persistence Třída:WorldAnchorStore
WorldAnchorStore vytváří holografická prostředí, kde hologramy zůstávají v konkrétních reálných pozicích napříč instancemi aplikace. Uživatelé si můžou připnout jednotlivé hologramy, kam chtějí, a později je najít na stejném místě v relacích aplikace.
Umožňuje WorldAnchorStore zachovat umístění světových ukotvení napříč relacemi. Pokud chcete zachovat hologramy napříč relacemi, mějte samostatný přehled o GameObjects tom, které používají konkrétní světovou kotvu. Můžete vytvořit kořen se GameObject světovou kotvou a ukotvit podřízené hologramy pomocí něj s posunem místní pozice.
Načtení hologramů z předchozích relací:
Získejte .WorldAnchorStore
Načtěte data aplikace world anchor, která vám poskytne ID světové kotvy.
Načtěte ukotvení světa podle jejího ID.
Uložení hologramů pro budoucí relace:
Získejte .WorldAnchorStore
Uložte ukotvení světa a zadejte ID.
Uložte data aplikace související se světovou kotvou spolu s ID.
Získat WorldAnchorStore
Ponechte si odkaz na WorldAnchorStore, abyste věděli, kdy je připravená k provedení operace. Vzhledem k tomu, že toto volání je asynchronní, můžete hned po spuštění aplikace volat:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded je obslužná rutina po WorldAnchorStore dokončení načítání:
Teď máte odkaz na WorldAnchorStore, který můžete použít k uložení a načtení konkrétních světových ukotvení.
Save a world anchor
Pokud chcete zachránit kotvu světa, pojmenujte ji a předejte ji v tom, co WorldAnchorStore jste získali předtím. Pokud se pokusíte uložit dvě ukotvení do stejného řetězce, store.Save vrátí hodnotu false. Před uložením nového odstraňte předchozí uložení.
private void SaveGame()
{
// Save data about holograms that this world anchor positions
if (!this.savedRoot) // Only save the root once
{
this.savedRoot = this.store.Save("rootGameObject", anchor);
Assert(this.savedRoot);
}
}
Načtení světové kotvy
Načtení světové kotvy:
private void LoadGame()
{
// Saved data about holograms that this world anchor positions:
this.savedRoot = this.store.Load("rootGameObject", rootGameObject);
if (!this.savedRoot)
{
// Game root not saved. Re-place objects or start over.
}
}
Můžete také použít store.Delete() k odebrání ukotvení, které jste dříve uložili, a store.Clear() k odebrání všech dříve uložených dat.
Výčet existujících ukotvení
Pokud chcete zobrazit seznam uložených ukotvení, zavolejte GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Zachování hologramů pro více zařízení
Azure Spatial Anchors můžete použít k vytvoření odolné cloudové kotvy z místní světové kotvy. Vaše aplikace může najít ukotvení cloudu na více zařízeních HoloLens, iOS a Android, a to i v případě, že zařízení nejsou současně pohromadě. Vzhledem k tomu, že jsou cloudové kotvy trvalé, může několik zařízení zobrazit obsah vykreslený vzhledem k této ukotvení ve stejném fyzickém umístění v průběhu času.