Systemy współrzędnych w a unity

Windows Mixed Reality obsługuje aplikacje w szerokim zakresie skalowania obsługi, od aplikacji tylko do orientacji i aplikacji w skali miejscowej po aplikacje w skali pomieszczenia. Na HoloLens możesz tworzyć aplikacje o skali światowej, które pozwalają użytkownikom przechodzić poza 5 metrów, eksplorując całe dziesieć budynku i nie tylko.

Pierwszym krokiem tworzenia rzeczywistości mieszanej w a aparatu Unity jest zrozumienie systemów współrzędnych i wybranie skali docelowej dla aplikacji.

Tworzenie obsługi tylko w orientacji lub w skali miejscowej

Przestrzeń nazw:UnityEngine.XR
Typ:XRDevice

Aby utworzyć środowisko o skali tylko orientacji lub w skali z miejscami, należy ustawić dla aparatu Unity typ przestrzeni śledzenia Naimki. Układ współrzędnych świata aparatu Unity w celu śledzenia kosmicznych ram odniesienia. W trybie śledzenia obrazów 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
Type:InputTracking

W przypadku czystego doświadczenia tylko w orientacji, takiego jak 360-stopniowa przeglądarka wideo (w której aktualizacje głowy pozyacyjne zrujnują iluzję), można ustawić XR. InputTracking.disablePositionalTracking na true:

InputTracking.disablePositionalTracking = true;

W przypadku obsługi w skali z miejscami, aby pozwolić użytkownikowi na późniejsze późniejsze odsienie miejsca początkowego, możesz wywołać XR. InputTracking.Recenter, metoda:

InputTracking.Recenter();

Tworzenie obsługi skalowania na stojąco lub w pomieszczeniu

Przestrzeń nazw:UnityEngine.XR
Typ:XRDevice

Aby uzyskać środowisko o skalipomieszczenia lub na stałe, należy umieścić zawartość względem podłogi. Powodem jest użycie etapu przestrzennego , który reprezentuje zdefiniowane przez użytkownika źródło na poziomie podłogi i opcjonalną granicę pomieszczenia, które zostały ustawione podczas pierwszego uruchomienia.

Aby upewnić się, że unity działa ze swoim globalnym systemem współrzędnych na poziomie podłogi, możesz ustawić i przetestować, czy 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 wartość SetTrackingSpaceType zwróci wartość true, unity pomyślnie przełączyła swój układ współrzędnych świata w celu śledzenia ramki etapu odniesienia.
  • Jeśli typ SetTrackingSpaceType zwróci wartość false, środowisko Unity nie może przełączyć się do ramki odniesienia etapu, prawdopodobnie dlatego, że użytkownik nie stelażuje podłogi w swoim środowisku. Chociaż fałszywa wartość zwracana nie jest powszechna, może się zdarzyć, jeśli etap zostanie ustawiony w innym pomieszczeniu, a urządzenie zostanie przeniesione do bieżącego pokoju bez konieczności konfigurowania nowego etapu przez użytkownika.

Gdy aplikacja pomyślnie ustawia typ przestrzeni śledzenia RoomScale, zawartość umieszczona na płaszczyźnie y=0 pojawi się na powierzchni. Początek o 0, 0, 0 będzie konkretnym miejscem na podłogach, w którym użytkownik stanął podczas konfigurowania pokoju, a znak -Z będzie reprezentował kierunek do przodu, z którym miał do czynienia podczas instalacji.

Przestrzeń nazw:UnityEngine.Experimental.XR
Type:Boundary

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 zdefiniuje granicę (zostanie wrócisz do listy wierzchołków), można bezpiecznie dostarczyć użytkownikowi środowisko o skali pomieszczenia, w którym będzie można przechodzić między sceną, która zostanie przez Ciebie tworzymy.

Uwaga

System automatycznie wyrenderuje granicę, gdy użytkownik zbliży się do tej granicy. Aplikacja nie musi używać tego wielokąta do renderowania samej granicy. Można jednak rozłożyć obiekty sceny przy użyciu tego wielokąta granicy, aby upewnić się, że użytkownik może fizycznie uzyskać dostęp do tych obiektów bez konieczności 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 światowej skali

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

W przypadku prawdziwych doświadczeń na skalę HoloLens, które umożliwiają użytkownikom wędrowanie poza 5 metrów, potrzebne będą nowe techniki poza tymi, które są używane do obsługi 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 przejechał , a następnie ponownie znaleźć te hologramy w kolejnych sesjach.

W a aparatu Unity tworzysz kotwicę przestrzenną, dodając składnik WorldAnchor Unity do elementu GameObject.

Dodawanie zakotwiczenia świata

Aby dodać kotwicę świata, wywołaj obiekt AddComponentWorldAnchor<>() na obiekcie gry za pomocą transformacji, którą chcesz zakotwiczyć w świecie rzeczywistym.

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

Gotowe. 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 w celu zapewnienia fizycznego wyrównania. Użyj trwałości, aby ponownie znaleźć tę zakotwiczone lokalizację w przyszłej sesji aplikacji.

Usuwanie zakotwiczenia świata

Jeśli nie chcesz już, aby element GameObject był zablokowany w fizycznej lokalizacji świata i nie zamierzasz przenosić tej ramki, możesz po prostu wywołać element Destroy na składniku World Anchor.

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

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

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

Przenoszenie zakotwiczenia w świecie gameobject

Nie można przenieść klasy GameObject, gdy znajduje się na nim kotwica świata. Jeśli musisz przenieść tę ramkę GameObject, musisz:

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

Obsługa zmian w locatability

W świecie fizycznym w pewnym momencie nie można przechwycić klasy WorldAnchor. W takim przypadku unity nie będzie aktualizować przekształcenia zakotwiczenia obiektu. Może to również ulec zmianie, gdy aplikacja jest uruchomiona. Brak obsługi zmiany w locatability spowoduje, że obiekt nie pojawi się w prawidłowej lokalizacji fizycznej na świecie.

Aby być powiadamiany o zmianach w locatability:

  1. Subskrybowanie zdarzenia OnTrackingChanged
  2. Obsługa zdarzenia

Zdarzenie OnTrackingChanged będzie wywoływane za każdym razem, gdy bazowa kotwica przestrzenna zmieni się między stanem locatable a nie jest locatable.

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 AddComponentWorldAnchor<>() zwróci wartość . W związku z tym zdarzenie OnTrackingChanged nie zostanie wyzwolone. Czystym wzorcem jest wywołanie 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ę w chmurze z lokalnego programu WorldAnchor, którą aplikacja może następnie zlokalizować na wielu HoloLens urządzeniach z systemami iOS i Android. Udostępniając wspólną kotwicę przestrzenną na wielu urządzeniach, każdy użytkownik może zobaczyć zawartość renderowana względem tej kotwicy w tej samej lokalizacji fizycznej. Umożliwia to współdzielone środowisko w czasie rzeczywistym.

Aby rozpocząć tworzenie udostępnionych doświadczeń w a unity, wypróbuj 5-minutowe przewodniki Szybki start platformy Azure Spatial Anchors Unity.

Po uruchomieniu usługi Azure Spatial Anchors można tworzyć i lokalizować kotwice w a aparatu Unity.

Następny punkt kontrolny projektowania

Jeśli podążasz za punktem kontrolnym tworzenia aparatu Unity, który już założyłyśmy, jesteś w trakcie eksplorowania podstawowych bloków konstrukcyjnych Mixed Reality Unity. W tym miejscu możesz przejść do następnego bloku:

Lub przejdź do Mixed Reality i interfejsów API platformy:

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

Zobacz też