Układy współrzędnych w środowisku Unity

Windows Mixed Reality obsługuje aplikacje w szerokim zakresie skalowania, od aplikacji tylko do orientacji i aplikacji skalowanych na dużą skalę w górę za pośrednictwem aplikacji w skali pokoju. Na urządzeniu HoloLens możesz przejść dalej i tworzyć aplikacje na skalę światową, które pozwalają użytkownikom chodzić poza 5 metrów, eksplorując całe piętro budynku i poza nią.

Pierwszym krokiem w tworzeniu środowiska rzeczywistości mieszanej w środowisku Unity jest zrozumienie systemów współrzędnych i wybranie skali środowiska , dla których będzie docelowa aplikacja.

Tworzenie środowiska skalowania tylko do orientacji lub siedzenia

Przestrzeń nazw:UnityEngine.XR
Type:XRDevice

Aby utworzyć środowisko tylko do orientacji lub na dużą skalę, należy ustawić środowisko Unity na typ przestrzeni śledzenia stacjonarnego. Stacjonarne śledzenie przestrzeni ustawia układ współrzędnych świata aparatu Unity w celu śledzenia stacjonarnej ramy odniesienia. W trybie śledzenia stacjonarnego zawartość umieszczona w edytorze tuż przed domyślną lokalizacją aparatu (do przodu to -Z) pojawi się przed użytkownikiem po uruchomieniu aplikacji.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Przestrzeń nazw:UnityEngine.XR
Type:InputTracking

W przypadku czystego środowiska tylko orientacji , takiego jak 360-stopniowa przeglądarka wideo (gdzie aktualizacje głowicy pozycyjnej zrujnuje iluzję), można następnie ustawić XR. InputTracking.disablePositionalTracking ma wartość true:

InputTracking.disablePositionalTracking = true;

W przypadku środowiska na dużą skalę, aby umożliwić użytkownikowi później nowsze miejsce pochodzenia, możesz wywołać XR. InputTracking.Recenter , metoda:

InputTracking.Recenter();

Tworzenie środowiska skalowania na stojąco lub w skali pokoju

Przestrzeń nazw:UnityEngine.XR
Type:XRDevice

W przypadku środowiska skalowania na stojąco lub w skali pomieszczenia należy umieścić zawartość względem podłogi. Przyczyną podłogi użytkownika jest etap przestrzenny, który reprezentuje zdefiniowane przez użytkownika źródło na poziomie podłogi i opcjonalną granicę pomieszczenia, skonfigurowaną podczas pierwszego uruchomienia.

Aby upewnić się, że aparat Unity działa z jego światowym systemem współrzędnych na poziomie podłogi, można ustawić i przetestować, że aparat Unity używa typu przestrzeni śledzenia 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.
}
  • Jeśli funkcja SetTrackingSpaceType zwróci wartość true, aparat Unity pomyślnie przełączył swój system współrzędnych świata w celu śledzenia ramki etapu odwołania.
  • Jeśli funkcja SetTrackingSpaceType zwraca wartość false, aparat Unity nie może przełączyć się do ramki etapu odwołania, prawdopodobnie dlatego, że użytkownik nie skonfigurował podłogi w swoim środowisku. Chociaż wartość zwracana fałsz nie jest powszechna, może się zdarzyć, że etap jest skonfigurowany w innym pomieszczeniu, a urządzenie jest przenoszone do bieżącego pokoju bez konfigurowania nowego etapu przez użytkownika.

Po pomyślnym ustawieniu typu śledzenia roomScale zawartość umieszczona na płaszczyźnie y=0 zostanie wyświetlona na podłodze. Początek 0, 0, 0 będzie konkretnym miejscem na podłodze, na którym użytkownik stał podczas instalacji pomieszczenia, z -Z reprezentującym kierunek do przodu, przed którym stoi podczas instalacji.

Przestrzeń nazw:UnityEngine.Experimental.XR
Typ:Granica

W kodzie skryptu można następnie wywołać metodę TryGetGeometry w typie UnityEngine.Experimental.XR.Boundary, aby uzyskać wielokąt granicy, określając typ granicy TrackedArea. Jeśli użytkownik zdefiniował granicę (zostanie przywrócona lista wierzchołków), można bezpiecznie zapewnić użytkownikowi środowisko skalowania pomieszczeń , w którym mogą chodzić po tworzonej scenie.

Uwaga

System automatycznie renderuje granicę, gdy użytkownik zbliża się do niego. Aplikacja nie musi używać tego wielokąta do renderowania samej granicy. Można jednak określić układ obiektów sceny przy użyciu tego wielokąta granic, aby upewnić się, że użytkownik może fizycznie dotrzeć do tych obiektów bez teleportowania:

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.
}

Tworzenie środowiska na skalę światową

Przestrzeń nazw:UnityEngine.XR.WSA
Type:WorldAnchor

W przypadku rzeczywistych środowisk na skalę światową na urządzeniu HoloLens, które pozwalają użytkownikom wędrować poza 5 metrów, potrzebne będą nowe techniki poza tymi używanymi do obsługi środowisk w skali pomieszczenia. Jedną z kluczowych technik, których użyjesz, jest utworzenie kotwicy przestrzennej w celu zablokowania klastra hologramów dokładnie w świecie fizycznym, bez względu na to, jak daleko użytkownik wędrował, a następnie ponownie znaleźć te hologramy w kolejnych sesjach.

W środowisku Unity utworzysz kotwicę przestrzenną, dodając składnik WorldAnchor Unity do obiektu GameObject.

Dodawanie zakotwiczenia świata

Aby dodać kotwicę świata, wywołaj metodę AddComponent<WorldAnchor>() na obiekcie gry z przekształceniem, które chcesz zakotwiczyć w świecie rzeczywistym.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Gotowe. Ten obiekt gry będzie teraz zakotwiczony w jego 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. Użyj trwałości , aby ponownie znaleźć tę zakotwiczoną lokalizację w przyszłej sesji aplikacji.

Usuwanie zakotwiczenia świata

Jeśli nie chcesz już, aby obiekt GameObject został zablokowany w lokalizacji świata fizycznego i nie zamierzasz przenosić tej ramki, możesz po prostu wywołać metodę Destroy w składniku World Anchor.

Destroy(gameObject.GetComponent<WorldAnchor>());

Jeśli chcesz przenieść tę ramkę GameObject, musisz zamiast tego wywołać metodę DestroyImmediate.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

Przenoszenie obiektu GameObject zakotwiczonego na świecie

Nie można przenieść obiektu GameObject, gdy na nim znajduje się kotwica świata. Jeśli musisz przenieść obiekt GameObject w tej ramce, musisz:

  1. DestroyImmediate składnika World Anchor
  2. Przenoszenie obiektu GameObject
  3. Dodaj nowy składnik World Anchor do obiektu GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Obsługa zmian lokalizacyjnych

WorldAnchor może nie być lokalizowalny w świecie fizycznym w czasie. W takim przypadku środowisko Unity nie będzie aktualizować przekształcenia zakotwiczonego obiektu. Może to również ulec zmianie, gdy aplikacja jest uruchomiona. Niepowodzenie obsługi zmiany lokalizowania spowoduje, że obiekt nie będzie wyświetlany w prawidłowej lokalizacji fizycznej na świecie.

Aby otrzymywać powiadomienia o zmianach lokalizacyjne:

  1. Subskrybowanie zdarzenia OnTrackingChanged
  2. Obsługa zdarzenia

Zdarzenie OnTrackingChanged będzie wywoływane za każdym razem, gdy podstawowa kotwica przestrzenna zmienia się między stanem lokalizowania a nie lokalizowaniem.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Następnie obsłuż zdarzenie:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
    // This simply activates/deactivates this object and all children when tracking changes
    self.gameObject.SetActiveRecursively(located);
}

Czasami kotwice znajdują się natychmiast. W takim przypadku właściwość isLocated kotwicy zostanie ustawiona na wartość true, gdy funkcja AddComponent<WorldAnchor>() zwróci wartość true. W rezultacie zdarzenie OnTrackingChanged nie zostanie wyzwolone. Czysty wzorzec polega na wywołaniu procedury obsługi OnTrackingChanged z początkowym stanem IsLocated po dołączeniu kotwicy.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Udostępnianie kotwic między urządzeniami

Użyj usługi Azure Spatial Anchors , aby utworzyć trwałą kotwicę chmury na podstawie lokalnego narzędzia WorldAnchor, który aplikacja może następnie zlokalizować na wielu urządzeniach HoloLens, iOS i Android. Udostępniając wspólną kotwicę przestrzenną na wielu urządzeniach, każdy użytkownik może zobaczyć zawartość renderowaną względem tej kotwicy w tej samej lokalizacji fizycznej. Umożliwia to udostępnianie środowisk w czasie rzeczywistym.

Aby rozpocząć tworzenie udostępnionych środowisk w środowisku Unity, wypróbuj 5-minutowe przewodniki Szybki start usługi Azure Spatial Anchors Unity.

Po uruchomieniu usługi Azure Spatial Anchors możesz utworzyć i zlokalizować kotwice w środowisku Unity.

Następny punkt kontrolny programowania

Jeśli obserwujesz określoną podróż do punktu kontrolnego tworzenia aparatu Unity, jesteś w środku eksplorowania podstawowych bloków konstrukcyjnych Mixed Reality. W tym miejscu możesz przejść do następnego bloku konstrukcyjnego:

Możesz też przejść do Mixed Reality możliwości platformy i interfejsów API:

Zawsze możesz wrócić do punktów kontrolnych programowania aparatu Unity w dowolnym momencie.

Zobacz też