Získání hologramů k tomu, aby zůstaly na místě, přesouvali se s vámi nebo se v některých případech umístili vzhledem k jiným hologramům, je velkou součástí vytváření aplikací hybridní reality. Tento článek vás provede naším doporučeným řešením pomocí nástrojů World Locking Tools, ale budeme se zabývat také ručním nastavením prostorových ukotvení v projektech Unity. Než se pustíme do jakéhokoli kódu, je důležité pochopit, jak Unity zpracovává souřadnicový prostor a kotvy ve vlastním modulu.
Světové souřadnicové systémy
Při psaní her, aplikací pro vizualizaci dat nebo aplikací virtuální reality je dnes typickým přístupem vytvořit jeden absolutní souřadnicový systém světa, ke kterému se všechny ostatní souřadnice můžou spolehlivě mapovat. V daném prostředí můžete vždy najít stabilní transformaci, která definuje vztah mezi libovolnými dvěma objekty na daném světě. Pokud jste tyto objekty nepřesunuli, jejich relativní transformace zůstanou vždy stejné. Tento druh globálního souřadnicového systému je snadné získat právo při vykreslování čistě virtuálního světa, kde znáte všechny geometrie předem. Dnes aplikace VR na úrovni místností obvykle vytvářejí tento druh absolutního souřadnicového systému na úrovni místnosti s jeho původem na podlaze.
Naproti tomu zařízení s hybridní realitou, jako je HoloLens, má dynamické porozumění světu řízené senzory, a průběžně upravuje své znalosti v průběhu času okolí uživatele, protože prochází mnoho metrů přes celé patro budovy. Pokud byste všechny hologramy umístili do naivního tuhého souřadnicového systému, tyto hologramy by se v průběhu času nakonec posunovaly, a to buď na základě světa, nebo vzhledem k sobě.
Náhlavní souprava může například v současné době uvěřit, že dvě umístění na světě jsou 4 metry od sebe, a pak později upřesnit, že pochopení, že umístění jsou ve skutečnosti 3,9 metrů od sebe. Pokud byly tyto hologramy původně umístěny 4 metry od jednoho tuhého souřadnicového systému, jeden z nich by pak vždy vypadal 0,1 metrů 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 sebekonzistenci 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á.
World Locking Tools (WLT) vám poskytne to nejlepší z obou světů, stabilizuje jeden pevný souřadnicový systém pomocí interní dodávky prostorových ukotvení rozložených po celé virtuální scéně, jak se uživatel pohybuje kolem. WLT analyzuje souřadnice kamery a prostorové ukotvení každého snímku. Místo toho, aby se měnily souřadnice všeho na světě, aby se opravily v souřadnicích hlavy uživatele, WLT místo toho opravuje souřadnice hlavy.
Nástroje World Locking Tools poskytují stabilní souřadnicový systém, který minimalizuje viditelné nekonzistence mezi virtuálními a skutečnými značkami světa. World Locking Tools world-locks celé scény se sdíleným fondem ukotvení, nikoli uzamknout každou skupinu objektů pomocí vlastní individuální ukotvení skupiny.
World Locking Tools automaticky zpracovává interní vytváření a správu prostorových ukotvení. Kvůli tomu, aby hologramy zůstaly po celém světě zamknuté, nemusíte s ARAnchorManagerem ani WorldAnchorem pracovat.
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 pro funkce hybridní reality. Další informace o základech najdete na hlavní stránce dokumentace nástroje 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 konfigurace scény z nástrojů Mixed Reality > World Locking Tools:
Důležité
Nástroj Konfigurovat scénu můžete kdykoli znovu spustit. Pokud se například cíl rozšířené reality změnil ze starší verze na XR SDK, měl by se znovu spustit. Pokud je scéna již správně nakonfigurovaná, spuštění nástroje nemá žádný vliv.
Vizualizéry
Během raného vývoje může být přidání vizualizérů užitečné k zajištění správného nastavení a fungování WLT. Dají se odebrat z 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. Pokud se chcete seznámit se základy arAnchors v ARFoundation, navštivte příručku ARFoundation pro Správce ukotvení AR.
Tento herní objekt je nyní ukotvený k jeho aktuálnímu umístění ve fyzickém světě. Jeho souřadnice světa Unity se můžou v průběhu času mírně upravit, aby se zajistilo fyzické zarovnání. Podívejte se , jak načíst světovou kotvu a najít toto ukotvené umístění znovu v budoucí relaci aplikace.
Odebrání ukotvení světa
Pokud už nechcete GameObject , aby byl uzamčený na fyzickém světě a nemáte v úmyslu tento rámec přesunout, zavolejte Destroy komponentu World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Pokud chcete přesunout GameObject tento rámec, zavolejte DestroyImmediate místo toho.
Ukotvení světa nemusí být v fyzickém světě v určitém okamžiku lokovatelné. Unity pak neaktualizuje transformaci ukotveného objektu. K této situaci může také dojít, když je aplikace spuštěná. Selhání zpracování změny v lokatability 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:
Přihlaste se k odběru OnTrackingChanged události. Událost OnTrackingChanged se volá vždy, když se podkladová prostorová kotva změní mezi stavem, který je lokovatelný nebo není lokovatelný.
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 vlastnost ukotvení je nastavena na true při AddComponent<WorldAnchor>() návratu. OnTrackingChanged Proto se událost neaktivuje. Čistější vzor je volat obslužnou rutinu OnTrackingChanged s počátečním IsLocated stavem po připojení ukotvení.
Prostorové ukotvení šetří hologramy v reálném světě mezi relacemi aplikací. Jakmile jsou uloženy v úložišti ukotvení HoloLens, prostorové kotvy se dají najít a načíst do různých relací a jsou ideální pro návrat, když neexistuje 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í ukotvení a ukotvení Azure můžete mít ve stejném projektu bez konfliktu. Další informace o integraci cloudových služeb Azure pro ukládání ukotvení najdete v tématu Azure Spatial Anchors.
Ve výchozím nastavení nástroje World Locking Tools obnoví 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 hologram zobrazoval na stejném místě ve fyzickém světě po ukončení a opětovném spuštění aplikace, musí aplikace obnovit pouze stejnou pozici hologramu.
Pokud aplikace potřebuje jemně řídit, můžete v inspektoru zakázat automatické ukládání a automatické načítání a spravovat trvalost ze skriptu. Další informace naleznete v tématu Zachování prostorových souřadnicových systémů.
World Locking Tools podporuje trvalost místních ukotvení pouze na zařízeních HoloLens. Pro zařízení s Androidem, iOSem a HoloLensem se integrujte se službou Azure Spatial Anchors, která podporují trvalost a sdílení souřadnicových prostorů 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 World Locking Tools (WLT) v kombinaci s Azure Spatial Anchors (ASA).
Rozhraní API označované jako XRAnchorStore povolení k zachování 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 ukotvení z úložiště do nového ARAnchorsnebo odstranit ukotvení z úložiště.
Poznámka:
Tyto kotvy uložíte a načtete na stejném zařízení. Ukotvení mezi zařízeními se podporuje prostřednictvím Azure Spatial Anchors.
Obory názvů
Pro Unity 2020 a OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
nebo Modul plug-in Unity 2019/2020 + Windows XR:
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 rozšiřující metodu v XRAnchorSubsystem, subsystém arAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Pokud chcete načíst XRAnchorStore s Unity 2019/2020 a modul plug-in Windows XR, použijte metodu rozšíření v 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řejděte k němu z subsystému ARAnchorManager následujícím způsobem:
Pokud se chcete podívat na úplný příklad zachování nebo zrušení uchování ukotvení ukotvení, podívejte se na web Anchors –> Anchors Sample GameObject a AnchorsSample.cs skript v [ukázkové scéně modulu plug-in OpenXR pro hybridní realitu](https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples):
Pro trvalost hologramu ve starších verzích Unity nebo 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é můžou připnout jednotlivé hologramy tam, kde chtějí, a později je najít ve stejném místě v relacích aplikací.
Umožňuje WorldAnchorStore zachovat umístění světových ukotvení napříč relacemi. Pokud chcete zachovat hologramy napříč relacemi, mějte přehled o GameObjects tom, jak používat konkrétní světovou ukotvení. Můžete vytvořit GameObject kořen se světovou ukotvením a podřízené hologramy ukotvením s posunem místní pozice.
Načtení hologramů z předchozích relací:
Získat .WorldAnchorStore
Načtěte data aplikace world anchor, která poskytují ID světové ukotvení.
Načtěte světovou ukotvení podle jeho ID.
Uložení hologramů pro budoucí relace:
Získat .WorldAnchorStore
Uložte světovou kotvu a zadejte ID.
Uložte data aplikace související se světovou ukotvení spolu s ID.
Získat WorldAnchorStore
Mějte odkaz na objekt WorldAnchorStore, abyste věděli, kdy je připravena provést operaci. Vzhledem k tomu, že toto volání je asynchronní, jakmile se aplikace spustí, můžete volat:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded je obslužná rutina po WorldAnchorStore dokončení načítání:
Nyní máte odkaz na WorldAnchorStore, který můžete použít k ukládání a načítání konkrétních světových ukotvení.
Uložení světové ukotvení
Pokud chcete zachránit světovou kotvu, pojmenujte ji a předejte ji do WorldAnchorStore toho, co jste získali. 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 souboru 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é ukotvení:
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.
Vytvoření výčtu existujících ukotvení
Chcete-li 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ého cloudového ukotvení z místního světa ukotvení. Vaše aplikace dokáže najít cloudové ukotvení napříč několika zařízeními s HoloLens, iOSem a Androidem, a to i v případě, že zařízení nejsou současně. Vzhledem k tomu, že cloudové kotvy jsou trvalé, může více zařízení zobrazit obsah vykreslený vzhledem k této ukotvení ve stejném fyzickém umístění v průběhu času.