Światowe blokowanie i kotwice przestrzenne w unity
Artykuł
Uzyskanie hologramów, aby pozostać na miejscu, przenieść się z Tobą lub w niektórych przypadkach pozycje względem innych hologramów jest ważną częścią tworzenia aplikacji Mixed Reality. Ten artykuł przeprowadzi Cię przez nasze zalecane rozwiązanie przy użyciu narzędzi world locking Tools, ale omówimy również ręczne konfigurowanie kotwic przestrzennych w projektach aparatu Unity. Zanim przejdziemy do dowolnego kodu, ważne jest, aby zrozumieć, jak aparat Unity obsługuje współrzędną przestrzeń i kotwice we własnym aucie.
Systemy współrzędnych skali światowej
Obecnie podczas pisania gier, aplikacji do wizualizacji danych lub aplikacji rzeczywistości wirtualnej typowe podejście polega na ustanowieniu jednego bezwzględnego systemu współrzędnych świata , do którego wszystkie inne współrzędne mogą niezawodnie mapować. W tym środowisku zawsze można znaleźć stabilną transformację, która definiuje relację między dowolnymi dwoma obiektami na tym świecie. Jeśli te obiekty nie zostaną przeniesione, ich względne przekształcenia zawsze pozostaną takie same. Ten rodzaj globalnego systemu współrzędnych jest łatwy do uzyskania podczas renderowania czysto wirtualnego świata, w którym wiesz z wyprzedzeniem całą geometrię. Aplikacje VR w skali pokoju obecnie zwykle ustanawiają ten rodzaj bezwzględnego systemu współrzędnych w skali pokoju z jego pochodzeniem na podłodze.
Z kolei urządzenie rzeczywistości mieszanej, takie jak HoloLens, ma dynamiczne zrozumienie świata oparte na czujnikach, stale dostosowując swoją wiedzę w czasie otoczenia użytkownika, gdy chodzi wiele metrów po całej podłodze budynku. W środowisku skali światowej, jeśli umieścisz wszystkie hologramy w naiwnym sztywnym układzie współrzędnych, te hologramy w końcu dryfują w czasie, albo na podstawie świata lub względem siebie.
Na przykład zestaw słuchawkowy może obecnie wierzyć, że dwie lokalizacje na świecie mają być od siebie 4 metrów, a następnie uściślić to zrozumienie, ucząc się, że lokalizacje są w rzeczywistości 3,9 metra od siebie. Gdyby te hologramy początkowo zostały umieszczone 4 metrów od siebie w jednym sztywnym układzie współrzędnych, jeden z nich zawsze pojawiałby się 0,1 metra od świata rzeczywistego.
Możesz ręcznie umieścić kotwice przestrzenne w środowisku Unity, aby zachować położenie hologramu w świecie fizycznym, gdy użytkownik jest mobilny. Jednak poświęca to spójność siebie w świecie wirtualnym. Różne kotwice stale poruszają się w stosunku do siebie, a także przechodzą przez globalną przestrzeń współrzędnych. W tym scenariuszu proste zadania, takie jak układ, stają się trudne. Symulacja fizyki może być również problematyczna.
Narzędzia world locking Tools (WLT) zapewnia najlepsze z obu światów, stabilizując jeden sztywny układ współrzędnych przy użyciu wewnętrznego dostarczania kotwic przestrzennych rozłożonych na całej scenie wirtualnej, gdy użytkownik porusza się. WLT analizuje współrzędne aparatu i te zakotwiczenia przestrzenne każdej ramki. Zamiast zmieniać współrzędne wszystkich elementów na świecie, aby zrekompensować poprawki we współrzędnych głowy użytkownika, WLT po prostu naprawia współrzędne głowy.
Narzędzia world locking tools udostępnia stabilny system współrzędnych, który minimalizuje widoczne niespójności między znacznikami wirtualnymi i rzeczywistymi. Narzędzia world locking tools blokuje całą scenę z udostępnioną pulą kotwic, zamiast blokować każdą grupę obiektów z własną pojedynczą kotwicą grupy.
Narzędzia world locking tools automatycznie obsługują tworzenie wewnętrzne i zarządzanie kotwicami przestrzennymi. Nie musisz wchodzić w interakcje z arAnchorManager lub WorldAnchor, aby zachować światowe blokady hologramów.
W przypadku aparatu Unity 2019/2020 przy użyciu biblioteki OpenXR lub wtyczki XR systemu Windows użyj narzędzia ARAnchorManager.
W przypadku starszych wersji aparatu Unity lub projektów WSA użyj narzędzia WorldAnchor.
Aby rozpocząć korzystanie z narzędzi world locking Tools, pobierz narzędzie Mixed Reality Feature Tool. Aby dowiedzieć się więcej na temat podstaw, zobacz stronę dokumentacji narzędzia do blokowania świata, aby uzyskać linki do tematu Przegląd, Szybki start i inne przydatne tematy.
Gdy projekt jest gotowy do pracy, uruchom narzędzie konfiguruj scenę z poziomu narzędzi Mixed Reality > World Locking Tools:
Ważne
Narzędzie Konfiguruj scenę można uruchomić ponownie w dowolnym momencie. Na przykład należy ponownie uruchomić element docelowy AR, jeśli element docelowy AR został zmieniony z starszej wersji na zestaw XR SDK. Jeśli scena jest już prawidłowo skonfigurowana, uruchomienie narzędzia nie ma wpływu.
Wizualizatory
Podczas wczesnego programowania dodanie wizualizatorów może być pomocne, aby upewnić się, że środowisko WLT jest skonfigurowane i działa prawidłowo. Można je usunąć z wydajności produkcyjnej lub jeśli z jakiegokolwiek powodu nie są już potrzebne, za pomocą narzędzia Usuń wizualizatory. Więcej szczegółów na temat wizualizatorów można znaleźć w dokumentacji narzędzia.
Ten obiekt gry jest teraz zakotwiczony w bieżącej lokalizacji w świecie fizycznym. Możesz zobaczyć, że współrzędne świata aparatu Unity są nieco dostosowywane w czasie, aby zapewnić wyrównanie fizyczne. Zobacz Załaduj zakotwiczenie zakotwiczonej lokalizacji w przyszłej sesji aplikacji, aby ponownie znaleźć tę zakotwiczoną lokalizację.
Usuwanie zakotwiczenia świata
Jeśli nie chcesz GameObject już zablokować lokalizacji świata fizycznego i nie zamierzasz przenosić tej ramki, wywołaj Destroy składnik World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Jeśli chcesz przenieść tę ramkę, wywołaj GameObject zamiast tego.DestroyImmediate
Przenoszenie obiektu GameObject zakotwiczonego na świecie
Nie można przenieść GameObject , gdy na nim znajduje się zakotwiczenie świata. Jeśli musisz przenieść tę ramkę GameObject , musisz wykonać następujące kroki:
DestroyImmediate składnik Zakotwiczenie świata.
Przenieś element GameObject.
Dodaj nowy składnik World Anchor do elementu GameObject.
Zakotwiczenie świata może nie być lokalizowalne w świecie fizycznym w czasie. Aparat Unity nie zaktualizuje transformacji zakotwiczonego obiektu. Taka sytuacja może również wystąpić, gdy aplikacja jest uruchomiona. Niepowodzenie obsługi zmiany lokalizowania powoduje, że obiekt nie pojawia się w prawidłowej lokalizacji fizycznej na świecie.
Aby otrzymywać powiadomienia o zmianach lokalizacyjne:
Subskrybuj OnTrackingChanged zdarzenie. Zdarzenie jest wywoływane za każdym razem, gdy podstawowa OnTrackingChanged kotwica przestrzenna zmienia się między stanem lokalizowania lub nie jest lokalizowana.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Jeśli kotwice znajdują się natychmiast, isLocated właściwość kotwicy jest ustawiana na true wartość po AddComponent<WorldAnchor>() powrocie. W związku z tym OnTrackingChanged zdarzenie nie jest wyzwalane. Czystszy wzorzec polega na wywołaniu OnTrackingChanged procedury obsługi z IsLocated początkowym stanem po dołączeniu kotwicy.
Zakotwiczenia przestrzenne zapisują hologramy w przestrzeni rzeczywistej między sesjami aplikacji. Po zapisaniu w magazynie kotwicy holoLens można znaleźć i załadować kotwice przestrzenne w różnych sesjach i być idealnym rezerwowym, gdy nie ma łączności z Internetem.
Ważne
Lokalne kotwice są przechowywane na urządzeniu, podczas gdy usługi Azure Spatial Anchors są przechowywane w chmurze. Możesz mieć lokalne i zakotwiczenia platformy Azure w tym samym projekcie bez konfliktu. Aby uzyskać więcej informacji na temat integrowania usług w chmurze platformy Azure do przechowywania kotwic, zobacz Azure Spatial Anchors.
Domyślnie narzędzia World Locking Tools przywracają system współrzędnych aparatu Unity względem świata fizycznego między sesjami na urządzeniach, które obsługują trwałość lokalnych kotwic przestrzennych. Aby hologram pojawił się w tym samym miejscu w świecie fizycznym po zakończeniu i ponownym uruchomieniu aplikacji, aplikacja musi przywrócić tę samą pozę do hologramu.
Jeśli aplikacja potrzebuje bardziej precyzyjnej kontroli, możesz wyłączyć automatyczne zapisywanie i automatyczne ładowanie w inspektorze oraz zarządzać trwałością skryptu. Aby uzyskać więcej informacji, zobacz Utrwalanie układów współrzędnych przestrzennych.
Interfejs API o nazwie XRAnchorStore umożliwia utrwalanie kotwic między sesjami. Jest to reprezentacja XRAnchorStore zapisanych kotwic na urządzeniu. Kotwice można utrwalać w ARAnchors scenie aparatu Unity, ładować kotwice z magazynu do nowych ARAnchorskotwic lub usuwać kotwice z magazynu.
Uwaga
Te kotwice można zapisywać i ładować na tym samym urządzeniu. Kotwice między urządzeniami są obsługiwane za pośrednictwem usługi Azure Spatial Anchors.
Przestrzenie nazw
Dla aparatów Unity 2020 i OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
lub Unity 2019/2020 + Wtyczka XR systemu Windows:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Metody publiczne
{
// 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);
}
Uzyskiwanie odwołania do magazynu zakotwiczenia
Aby załadować XRAnchorStore z aparatami Unity 2020 i OpenXR, użyj metody rozszerzenia w systemie XRAnchorSubsystem, podsystemie ARAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Aby załadować składnik XRAnchorStore za pomocą aparatu Unity 2019/2020 i wtyczki XR systemu Windows, użyj metody rozszerzenia w systemie XRReferencePointSubsystem (Unity 2019) lub XRAnchorSubsystem (Unity 2020), podsystemu 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);
Ładowanie magazynu kotwicy
Aby załadować magazyn kotwicy w środowiskach Unity 2020 i OpenXR, uzyskaj do niego dostęp z podsystemu ARAnchorManager w następujący sposób:
Aby wyświetlić pełny przykład utrwalania/nieuprawniania kotwic, zapoznaj się ze skryptem Anchors -> Anchors Sample GameObject i AnchorsSample.cs w przykładowej scenie [Mixed Reality przykładowej sceny wtyczki OpenXR]((https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples):
W przypadku trwałości hologramu w starszych wersjach aparatu Unity lub projektach WSA użyj narzędzia WorldAnchor.
Magazyn WorldAnchorStore tworzy środowiska holograficzne, w których hologramy pozostają w określonych rzeczywistych pozycjach w różnych wystąpieniach aplikacji. Użytkownicy mogą przypinać poszczególne hologramy wszędzie tam, gdzie chcą, i znajdować je w dalszej części tego samego miejsca w sesjach aplikacji.
Element WorldAnchorStore umożliwia utrwalanie lokalizacji kotwic świata między sesjami. Aby utrwały hologramy między sesjami, zachowaj oddzielną GameObjects ścieżkę, która używa określonego kotwicy świata. Możesz utworzyć GameObject element główny z kotwicą świata i zakotwiczyć hologramy podrzędne przy użyciu przesunięcia położenia lokalnego.
Aby załadować hologramy z poprzednich sesji:
Pobierz element WorldAnchorStore.
Załaduj dane aplikacji zakotwiczonej w świecie, co daje identyfikator zakotwiczenia świata.
Załaduj zakotwiczenie świata według jego identyfikatora.
Aby zapisać hologramy dla przyszłych sesji:
Pobierz element WorldAnchorStore.
Zapisz zakotwiczenie świata, określając identyfikator.
Zapisz dane aplikacji powiązane ze światem zakotwiczenia wraz z identyfikatorem.
Pobieranie magazynu WorldAnchorStore
Zachowaj odwołanie do elementu WorldAnchorStore, aby wiedzieć, kiedy jest gotowy do wykonania operacji. Ponieważ to wywołanie jest asynchroniczne, po uruchomieniu aplikacji można wywołać następujące wywołania:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded to program obsługi po zakończeniu WorldAnchorStore ładowania:
Masz teraz odwołanie do WorldAnchorStoreelementu , którego można użyć do zapisywania i ładowania określonych kotwic świata.
Zapisywanie kotwicy świata
Aby uratować kotwicę świata, nazwij kotwicę świata i przekaż ją wcześniej WorldAnchorStore . Jeśli spróbujesz zapisać dwie kotwice w tym samym ciągu, store.Save zwraca wartość false. Usuń poprzedni zapis przed zapisaniem nowego.
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);
}
}
Ładowanie zakotwiczenia świata
Aby załadować zakotwiczenie świata:
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.
}
}
Możesz również użyć store.Delete() polecenia , aby usunąć wcześniej zapisaną kotwicę i store.Clear() usunąć wszystkie wcześniej zapisane dane.
Wyliczanie istniejących kotwic
Aby wyświetlić listę przechowywanych kotwic, wywołaj metodę GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Utrwalanie hologramów dla wielu urządzeń
Za pomocą usługi Azure Spatial Anchors można utworzyć trwałą kotwicę chmury na podstawie lokalnej kotwicy świata. Aplikacja może zlokalizować kotwicę chmury na wielu urządzeniach HoloLens, iOS i Android, nawet jeśli urządzenia nie są jednocześnie połączone. Ponieważ kotwice w chmurze są trwałe, wiele urządzeń może wyświetlać zawartość renderowaną względem tej kotwicy w tej samej lokalizacji fizycznej w czasie.