Koordinatsystem i Unity

Windows Mixed Reality har stöd för appar i en mängd olika upplevelseskalor, från appar med endast orientering och sittande skalning upp via appar i rumsskala. På HoloLens kan du gå längre och skapa appar i världsskala som låter användare gå längre än 5 meter och utforska en hel våning i en byggnad och utanför.

Ditt första steg i att skapa en mixed reality-upplevelse i Unity är att förstå koordinatsystem och välja den upplevelseskala som din app ska rikta in sig på.

Skapa en orienteringsanpassad eller sittande skalningsupplevelse

Namnområde:UnityEngine.XR
Typ:XRDevice

För att skapa en orienteringsbaserad eller sittande skalningsupplevelse måste du ställa in Unity på utrymmestypen Stationär spårning. Stationära spårningsutrymmen ställer in Unitys världskoordinatsystem för att spåra referensramen. I läget Stationär spårning visas innehåll som placeras i redigeraren precis framför kamerans standardplats (framåt är -Z) framför användaren när appen startas.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Namnområde:UnityEngine.XR
Typ:InputTracking

För en ren orienteringsupplevelse som en 360-graders videovisare (där positionella huvuduppdateringar skulle förstöra illusionen) kan du sedan ställa in XR. InputTracking.disablePositionalTracking till true:

InputTracking.disablePositionalTracking = true;

Om du vill ha en platsbaserad skalningsupplevelse kan du anropa XR för att låta användaren senare använda det sittande ursprunget . InputTracking.Recenter-metod :

InputTracking.Recenter();

Skapa en upplevelse i stående skala eller i rumsskala

Namnområde:UnityEngine.XR
Typ:XRDevice

För en upplevelse i stående skala eller rumsskala måste du placera innehåll i förhållande till golvet. Du resonerar om användarens golv med hjälp av den rumsliga fasen, som representerar användarens definierade ursprung på golvnivå och valfri rumsgräns, som konfigurerats under första körningen.

För att säkerställa att Unity fungerar med sitt världskoordinatsystem på golvnivå kan du ange och testa att Unity använder space-typen RoomScale-spårning:

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.
}
  • Om SetTrackingSpaceType returnerar true har Unity växlat sitt världskoordinatsystem för att spåra referensramen för scenen.
  • Om SetTrackingSpaceType returnerar falskt kunde Unity inte växla till fasramen för referens, troligen eftersom användaren inte har konfigurerat en våning i sin miljö. Även om ett falskt returvärde inte är vanligt kan det inträffa om fasen har konfigurerats i ett annat rum och enheten flyttas till det aktuella rummet utan att användaren konfigurerar en ny fas.

När appen har ställt in utrymmestypen RoomScale-spårning visas innehåll som placerats på y=0-planet på golvet. Ursprunget vid 0, 0, 0 kommer att vara den specifika platsen på golvet där användaren stod under rumskonfigurationen, där -Z representerar den framåtriktade riktning de var riktade mot under installationen.

Namnområde:UnityEngine.Experimental.XR
Typ:Gräns

I skriptkoden kan du sedan anropa metoden TryGetGeometry på typen UnityEngine.Experimental.XR.Boundary för att hämta en gränspolygon som anger gränstypen TrackedArea. Om användaren har definierat en gräns (du får tillbaka en lista över hörn) är det säkert att leverera en upplevelse i rumsskala till användaren, där de kan gå runt på scenen som du skapar.

Anteckning

Systemet renderar automatiskt gränsen när användaren närmar sig den. Din app behöver inte använda den här polygonen för att återge själva gränsen. Du kan dock välja att placera ut scenobjekt med hjälp av den här gränspolygonen för att säkerställa att användaren fysiskt kan nå dessa objekt utan att teleportera:

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

Skapa en upplevelse i världsskala

Namnområde:UnityEngine.XR.WSA
Typ:WorldAnchor

För verkliga upplevelser i världsskala på HoloLens som låter användare vandra bortom 5 meter behöver du nya tekniker utöver de som används för upplevelser i rumsskala. En viktig teknik som du använder är att skapa en spatial fästpunkt för att låsa ett kluster av hologram exakt på plats i den fysiska världen, oavsett hur långt användaren har vandrat och sedan hitta dessa hologram igen i senare sessioner.

I Unity skapar du en spatial fästpunkt genom att lägga till Komponenten WorldAnchor Unity i ett GameObject.

Lägga till en världsfästpunkt

Om du vill lägga till en världsankare anropar du AddComponent<WorldAnchor>() på spelobjektet med den transformering som du vill förankra i den verkliga världen.

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

Klart! Det här spelobjektet kommer nu att vara förankrat på dess nuvarande plats i den fysiska världen – du kan se dess Unity-världskoordinater justeras något över tid för att säkerställa den fysiska justeringen. Använd persistence för att hitta den här förankrade platsen igen i en framtida appsession.

Ta bort en världsfästpunkt

Om du inte längre vill att GameObject ska låsas till en fysisk plats och inte tänker flytta den här ramen kan du bara anropa Destroy on the World Anchor-komponenten.

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

Om du vill flytta GameObject den här ramen måste du anropa DestroyImmediate i stället.

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

Flytta en värld förankrad GameObject

GameObject's kan inte flyttas när en World Anchor är på den. Om du behöver flytta GameObject den här ramen måste du:

  1. DestroyImmediate komponenten World Anchor
  2. Flytta GameObject
  3. Lägg till en ny World Anchor-komponent i GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Hantera ändringar i locatability

En WorldAnchor kanske inte är locatable i den fysiska världen vid en tidpunkt. Om detta inträffar kommer Unity inte att uppdatera transformering av det förankrade objektet. Detta kan också ändras när en app körs. Om det inte går att hantera ändringen av locatability visas objektet inte på rätt fysisk plats i världen.

Så här meddelas du om ändringar i locatability:

  1. Prenumerera på händelsen OnTrackingChanged
  2. Hantera händelsen

Händelsen OnTrackingChanged anropas när den underliggande spatiala fästpunkten ändras mellan tillståndet locatable eller locatable.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Hantera sedan händelsen:

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

Ibland finns fästpunkter omedelbart. I det här fallet anges den här isLocated-egenskapen för fästpunkten till true när AddComponent<WorldAnchor>() returneras. Därför utlöses inte Händelsen OnTrackingChanged. Ett rent mönster är att anropa din OnTrackingChanged-hanterare med det ursprungliga IsLocated-tillståndet efter att ha kopplat en fästpunkt.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Dela fästpunkter mellan enheter

Använd Azure Spatial Anchors för att skapa en beständig molnankare från en lokal WorldAnchor som din app sedan kan hitta på flera HoloLens-, iOS- och Android-enheter. Genom att dela en gemensam rumslig fästpunkt mellan flera enheter kan varje användare se innehåll som återges i förhållande till fästpunkten på samma fysiska plats. Detta möjliggör delade upplevelser i realtid.

Om du vill komma igång med att skapa delade upplevelser i Unity kan du prova snabbstarterna för Azure Spatial Anchors Unity på 5 minuter.

När du är igång med Azure Spatial Anchors kan du sedan skapa och hitta fästpunkter i Unity.

Nästa kontrollpunkt för utveckling

Om du följer unity-utvecklingskontrollpunktsresan som vi har lagt fram är du mitt uppe i att utforska de Mixed Reality grundläggande byggstenarna. Härifrån kan du fortsätta till nästa byggblock:

Eller gå vidare till Mixed Reality plattformsfunktioner och API:er:

Du kan alltid gå tillbaka till unity-utvecklingskontrollpunkterna när som helst.

Se även