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 z miejscami

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 klatki referencyjnej. 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
Typ: 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żesz ustawić XR. InputTracking.disablePositionalTracking na true:

InputTracking.disablePositionalTracking = true;

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

InputTracking.Recenter();

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

Przestrzeń nazw: UnityEngine.XR
Typ: XRDevice

W przypadku obsługi w skali pomieszczenia lub stałej zawartości 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 odwołania.
  • 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 skonfigurowania 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. Pochodzenie 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
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 zdefiniuje granicę (zostanie wrócisz do listy wierzchołków), można bezpiecznie dostarczyć użytkownikowi środowisko o skali pomieszczenia, w którym mogą oni przechodzić między scenami, które tworzysz.

Uwaga

System będzie automatycznie renderować granicę, gdy użytkownik do niego zbliży się. 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
Typ: 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 na miejscu w świecie fizycznym, niezależnie od tego, jak daleko użytkownik przejechał, a następnie ponownie znaleźć te hologramyw 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 pozycję AddComponent () 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 — jego współrzędne świata 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ść 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 AddComponent () 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 centrum WorldAnchor, które 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 platformy i interfejsów API:

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

Zobacz też