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 placering upp till appar i rumsskala. På HoloLens kan du gå vidare och skapa världsskaliga appar som låter användarna gå längre än 5 meter och utforska en hel våning i en byggnad och bortom.

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

Skapa en orienterings- eller platsskala-upplevelse

Namnrymd: UnityEngine.XR
Typ: XRDevice

Om du vill skapa en orienterings- eller platsskala-upplevelse måste du ställa in Unity på typen Stationary tracking space (Stationary tracking space type(Stationary tracking space type). Stationärt spårningsutrymme ställer in Unity:s världskoordinatsystem för att spåra den stationära referensramen. I läget Stationary tracking (Stationary tracking mode) 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);

Namnrymd: UnityEngine.XR
Typ: InputTracking

För en ren orienteringsupplevelse, till exempel ett 360 graders videovisningsprogram (där uppdateringar av positionens huvud skulle förstöra illusionen) kan du ange XR. InputTracking.disablePositionalTracking till true:

InputTracking.disablePositionalTracking = true;

För en upplevelse med platsskala kan du anropa XR för att senare låta användaren använda det platsbaserade ursprunget. InputTracking.Recenter-metod:

InputTracking.Recenter();

Skapa en upplevelse i stående skala eller rumsskala

Namnrymd: UnityEngine.XR
Typ: XRDevice

För en upplevelse i fristående skala eller rumsskala måste du placera innehåll i förhållande till ordet. Anledningen till att användarens golv använder det rumsliga stadiet , som representerar användarens definierade ursprung på golvnivå och valfria rumsgräns som konfigureras under den 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-spårningstypen 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.
}
  • Om SetTrackingSpaceType returnerar true har Unity växlat sitt världskoordinatsystem för att spåra fasramen för referensen.
  • Om SetTrackingSpaceType returnerar false kunde Unity inte växla till fasramen för referensen, troligen eftersom användaren inte har ställt in ett golv i sin miljö. Även om ett falskt returvärde inte är vanligt kan det inträffa om fasen har ställts in i ett annat rum och enheten flyttas till det aktuella rummet utan att användaren behöver konfigurera en ny fas.

När din app har ställer in utrymmestypen RoomScale visas innehåll som placerats på y=0-planet på marken. Ursprunget vid 0, 0, 0 är den specifika plats på den våning där användaren är nöjd under rummets konfiguration, där -Z representerar den riktning framåt som användaren var riktad mot under installationen.

Namnrymd: 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 och ange 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 rumsskalningsupplevelse till användaren, där de kan gå runt i 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 dina scenobjekt med 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

Namnrymd: UnityEngine.XR.WSA
Typ: WorldAnchor

För verkliga upplevelser i världsskala på HoloLens som gör att användarna kan gå längre än 5 meter behöver du nya tekniker utöver de som används för rumsupplevelser. En viktig teknik som du använder är att skapa en spatial fästpunkt för att låsa ett kluster med hologram exakt på plats i den fysiska världen, oavsett hur långt användaren har roamat 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 World Anchor

Om du vill lägga till en världsankare anropar du AddComponent () för spelobjektet med den transformering som du vill fästpunkt för i den verkliga världen.

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

Klart! Det här spelobjektet kommer nu att vara fäst vid den aktuella platsen i den fysiska världen – du kan se att 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ästa platsen igen i en framtida appsession.

Ta bort en Världsankare

Om du inte längre vill att GameObject ska låsas till en fysisk plats i världen och inte planerar att flytta den här ramen kan du bara anropa Destroy på 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 ett world Anchored GameObject

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

  1. DestroyImmediate the World Anchor component
  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 av lobcatability

En WorldAnchor kanske inte kan användas i den fysiska världen vid en tidpunkt. Om detta inträffar uppdaterar Unity inte transformeringen av det fästa objektet. Detta kan också ändras när en app körs. Om ändringen inte hanteras kommer objektet inte att visas på rätt fysisk plats i världen.

Så här meddelas du om ändringar i tillförlitligheten:

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

OnTrackingChanged-händelsen anropas när den underliggande spatiala fästpunkten ändras mellan ett tillstånd där den är oskadlig jämfört med om den inte är föråldrad.

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 egenskapen isLocated för fästpunkten till true när AddComponent () returnerar. Därför utlöses inte OnTrackingChanged-händelsen. Ett rent mönster är att anropa din OnTrackingChanged-hanterare med det första IsLocated-tillståndet när du har bifogat 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 spatial fästpunkt över 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 delad realtidsupplevelse.

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

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

Nästa kontrollpunkt för utveckling

Om du följer den resa med kontrollpunkten för Unity-utveckling som vi har tagit fram är du inte ute efter att utforska Mixed Reality grundläggande byggstenarna. Härifrån kan du fortsätta till nästa byggblock:

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

Du kan alltid gå tillbaka till kontrollpunkterna för Unity-utveckling när som helst.

Se även