Układy współrzędnych w aucie Unity

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

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

Tworzenie środowiska skalowania tylko do orientacji lub siedzenia

Przestrzeń nazw: UnityEngine.XR
Typ: XRDevice

Aby utworzyć środowisko skalowania tylko do orientacji lub siedzenia, należy ustawić aparat Unity na typ przestrzeni śledzenia stacjonarnego. Stacjonarne śledzenie kosmosu 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) będzie wyświetlana przed użytkownikiem po uruchomieniu aplikacji.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Przestrzeń nazw: UnityEngine.XR
Typ: InputTracking

W przypadku czystego środowiska tylko orientacji, takiego jak przeglądarka wideo 360 stopni (gdzie aktualizacje pozycyjne głowy zrujnowałyby iluzję), można następnie ustawić XR. InputTracking.disablePositionalTracking ma wartość true:

InputTracking.disablePositionalTracking = true;

Aby umożliwić użytkownikowi późniejsze ostatnie miejsce miejsca, możesz wywołać XR. InputTracking.Recenter, metoda:

InputTracking.Recenter();

Tworzenie środowiska na skalę stałą lub w skali pomieszczenia

Przestrzeń nazw: UnityEngine.XR
Typ: 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 użycie etapu przestrzennego, 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 systemem współrzędnych świata 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 parametr 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 właściwość 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ż fałsz zwracana wartość nie jest powszechna, może się zdarzyć, jeśli 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 skonfigurowaniu typu przestrzeni śledzenia roomScale zawartość umieszczona na płaszczyźnie y=0 będzie wyświetlana na podłodze. Początek 0, 0, 0 będzie konkretnym miejscem na podłodze, w którym użytkownik stał podczas konfiguracji pomieszczenia, z -Z reprezentującym kierunek przodu, z którym mieli do czynienia 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 granic, określając typ granicy TrackedArea. Jeśli użytkownik zdefiniował granicę (zostanie przywrócona lista wierzchołków), bezpiecznie dostarczyć 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 niej. 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
Typ: WorldAnchor

W przypadku rzeczywistych środowisk na dużą skalę na urządzeniu HoloLens, które pozwalają użytkownikom wędrować poza 5 metrów, potrzebne będą nowe techniki wykraczające poza te używane 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, niezależnie od tego, 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 kotwicy świata

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

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

I już! Ten obiekt gry będzie 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. 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ść obiekt GameObject w tej ramce, musisz wywołać metodę DestroyImmediate.

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

Przenoszenie obiektu GameObject zakotwiczonego na świecie

Obiektu GameObject nie można przenosić, gdy na nim znajduje się kotwica świata. Jeśli musisz przenieść obiekt GameObject w tej ramce, musisz wykonać następujące kroki:

  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 lokalizacyjne

WorldAnchor może nie być lokalizowalny w świecie fizycznym w czasie. W takim przypadku aparat Unity nie zaktualizuje przekształcenia zakotwiczonego obiektu. Może to również ulec zmianie, gdy aplikacja jest uruchomiona. Brak obsługi zmiany lokalizalności spowoduje, że obiekt nie pojawi się 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 bazowa 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 związku z tym 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 lokalnej usługi WorldAnchor, którą 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. Pozwala to na współużytkowane środowiska w czasie rzeczywistym.

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

Po rozpoczęciu pracy z usługą Azure Spatial Anchors możesz utworzyć i zlokalizować kotwice w środowisku Unity.

Następny punkt kontrolny programowania

Jeśli obserwujesz określoną podróż punktów kontrolnych tworzenia aparatu Unity, jesteś w trakcie eksplorowania podstawowych bloków konstrukcyjnych rzeczywistości mieszanej. W tym miejscu możesz przejść do następnego bloku konstrukcyjnego:

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

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

Zobacz też