Światowe blokowanie i zakotwiczenia przestrzenne w akiecie Unity
Artykuł
Pobieranie hologramów, aby pozostać na miejscu, przenieść się z Tobą lub w niektórych przypadkach pozycjonować się względem innych hologramów jest dużą częścią tworzenia aplikacji rzeczywistości mieszanej. Ten artykuł przeprowadzi Cię przez nasze zalecane rozwiązanie przy użyciu narzędzi do blokowania świata, ale omówimy również ręczne konfigurowanie kotwic przestrzennych w projektach aparatu Unity. Zanim przejdziemy do dowolnego kodu, ważne jest, aby zrozumieć, w jaki sposób aparat Unity obsługuje współrzędną przestrzeń i kotwice.
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 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 zwykle ustanawiają tego rodzaju bezwzględny system współrzędnych skali pokoju z jego pochodzeniem na podłodze.
Natomiast niezamierzone 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 o wiele metrów po całym piętrze budynku. W środowisku skali światowej, jeśli umieścisz wszystkie hologramy w naiwnym sztywnym układzie współrzędnych, te hologramy będą dryfować 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ć 4 metrów od siebie, a następnie udoskonalić 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 wydaje 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 odniesieniu 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 system współrzędnych przy użyciu wewnętrznego zaopatrzenia kotwic przestrzennych rozmieszczonych w całej scenie wirtualnej, gdy użytkownik porusza się wokół. Funkcja WLT analizuje współrzędne kamery i tych kotwic przestrzennych 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.
Wybieranie podejścia do blokowania świata
Jeśli to możliwe, użyj narzędzi world locking Tools do pozycjonowania hologramu.
Narzędzia do blokowania świata udostępnia stabilny system współrzędnych, który minimalizuje widoczne niespójności między znacznikami wirtualnych i rzeczywistych. Narzędzia world locking tools world-locks całej sceny 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 korzystać z programu ARAnchorManager ani 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 funkcji rzeczywistości mieszanej. 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 użycia, uruchom narzędzie do konfigurowania sceny z poziomu narzędzi Mixed Reality > World Locking Tools:
Ważne
Narzędzie Konfiguruj scenę można ponownie uruchomić 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 efektu.
Wizualizatory
Podczas wczesnego programowania dodanie wizualizatorów może być przydatne, 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 informacji na temat wizualizatorów można znaleźć w dokumentacji narzędzia.
Wtyczka OpenXR rzeczywistości mieszanej udostępnia podstawowe funkcje kotwicy za pomocą implementacji ARFoundation ARAnchorManager aparatu Unity. Aby dowiedzieć się więcej na temat aranchorów w arfoundation, odwiedź podręcznik ARFoundation dla menedżera zakotwiczenia AR.
Ten obiekt gry jest teraz zakotwiczony w bieżącej lokalizacji w świecie fizycznym. Współrzędne świata aparatu Unity mogą być nieco dostosowywane w czasie, aby zapewnić wyrównanie fizyczne. Zobacz ładowanie kotwicy świata, aby ponownie znaleźć tę zakotwiczoną lokalizację w przyszłej sesji aplikacji.
Usuwanie zakotwiczenia świata
Jeśli nie chcesz GameObject już mieć zablokowanej 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 DestroyImmediate metodę GameObject .
Kotwica świata może nie być lokalizowalny w świecie fizycznym w czasie. Aparat Unity nie zaktualizuje wówczas przekształcenia zakotwiczonego obiektu. Taka sytuacja może również wystąpić, gdy aplikacja jest uruchomiona. Brak obsługi zmiany lokalizacyjnych 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 OnTrackingChanged tym zdarzenie nie jest wyzwalane. Czystszy wzorzec polega na wywołaniu OnTrackingChanged procedury obsługi ze stanem początkowym IsLocated po dołączeniu kotwicy.
Zakotwiczenia przestrzenne zapisują hologramy w przestrzeni rzeczywistej między sesjami aplikacji. Po zapisaniu w magazynie kotwicy urządzenia HoloLens kotwice przestrzenne można znaleźć i załadować w różnych sesjach i są idealnym rezerwowym, gdy nie ma łączności z Internetem.
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 wymaga bardziej precyzyjnej kontroli, możesz wyłączyć automatyczne zapisywanie i automatyczne ładowanie w inspektorze i zarządzać trwałością ze skryptu. Aby uzyskać więcej informacji, zobacz Utrwalanie systemów współrzędnych przestrzennych.
Narzędzia World Locking Tools obsługują trwałość zakotwiczenia lokalnego tylko na urządzeniach HoloLens.
Interfejs API o nazwie XRAnchorStore umożliwia utrwalanie kotwic między sesjami. Jest XRAnchorStore to reprezentacja zapisanych kotwic na urządzeniu. Kotwice można utrwalać w ARAnchors scenie aparatu Unity, ładować kotwice z magazynu do nowych ARAnchorskotwic lub usuwać z magazynu.
Uwaga
Te kotwice można zapisywać i ładować na tym samym urządzeniu.
Przestrzenie nazw
W przypadku 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 kotwicy
Aby załadować magazyn XRAnchorStore z aparatami Unity 2020 i OpenXR, użyj metody rozszerzenia w systemie XRAnchorSubsystem, podsystemu ARAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Aby załadować moduł XRAnchorStore z aparatem Unity 2019/2020 i wtyczką 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/niepersystryzowania kotwic, zapoznaj się ze skryptem Anchors -> Anchors Sample GameObject i AnchorsSample.cs skryptu [Przykładowa scena wtyczki OpenXR rzeczywistości mieszanej]((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 później w tym samym miejscu w przypadku sesji aplikacji.
Umożliwia WorldAnchorStore utrwalanie lokalizacji zakotwiczeń świata między sesjami. Aby utrwalać hologramy między sesjami, należy zachować oddzielną GameObjects ścieżkę, która używa określonego kotwicy świata. Możesz utworzyć GameObject katalog 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 plik WorldAnchorStore.
Załaduj dane aplikacji zakotwiczenia świata, które dają identyfikator zakotwiczenia świata.
Załaduj zakotwiczenie świata według jego identyfikatora.
Aby zapisać hologramy dla przyszłych sesji:
Pobierz plik WorldAnchorStore.
Zapisz zakotwiczenie świata, określając identyfikator.
Zapisz dane aplikacji powiązane z kotwicą świata wraz z identyfikatorem.
Pobieranie magazynu WorldAnchorStore
Zachowaj odwołanie do WorldAnchorStoreelementu , 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łanie:
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 zakotwiczenia świata
Aby zapisać 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ń poprzednie zapisanie 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]);
}