Systemen coördineren in Unity

Windows Mixed Reality ondersteunt apps in een breed scala aan ervaringsschalen, van apps met alleen oriëntatie en zittende schaal omhoog tot apps op ruimteschaal. Op HoloLens kunt u verder gaan en wereldwijde apps bouwen waarmee gebruikers meer dan 5 meter kunnen lopen en een hele verdieping van een gebouw en daarbuiten kunnen verkennen.

Uw eerste stap bij het bouwen van een mixed reality-ervaring in Unity is het begrijpen van coördinatiesystemen en het kiezen van de ervaringsschaal voor uw app.

Een ervaring met alleen oriëntatie of zittende schaal bouwen

Naamruimte:UnityEngine.XR
Type:XRDevice

Als u een ervaring met alleen oriëntatie of zittende schaal wilt bouwen, moet u Unity instellen op het type Stationaire traceringsruimte. Stationaire traceringsruimte stelt het wereldcoördinaatsysteem van Unity in om het stationaire referentiekader te volgen. In de modus Stationair volgen wordt inhoud die in de editor wordt geplaatst vlak voor de standaardlocatie van de camera (vooruit is -Z) weergegeven voor de gebruiker wanneer de app wordt gestart.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Naamruimte:UnityEngine.XR
Type:InputTracking

Voor een pure oriëntatie-ervaring , zoals een 360-graden videoviewer (waarbij positionele hoofdupdates de illusie verpesten), kunt u vervolgens XR instellen. InputTracking.disablePositionalTracking to true:

InputTracking.disablePositionalTracking = true;

Voor een ervaring op plaatsschaal kunt u de XR aanroepen om de gebruiker later de zittende oorsprong te laten recenter maken. Methode InputTracking.Recenter :

InputTracking.Recenter();

Een staande of ruimteschaal-ervaring bouwen

Naamruimte:UnityEngine.XR
Type:XRDevice

Voor een staande ofruimteschaal-ervaring moet u inhoud ten opzichte van de vloer plaatsen. U redeneert over de vloer van de gebruiker met behulp van de ruimtelijke fase, die de gedefinieerde oorsprong op het vloerniveau en de optionele ruimtegrens van de gebruiker vertegenwoordigt, die tijdens de eerste run zijn ingesteld.

Om ervoor te zorgen dat Unity werkt met het wereldcoördinaatsysteem op vloerniveau, kunt u instellen en testen of Unity gebruikmaakt van het ruimtetype RoomScale-tracering:

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.
}
  • Als SetTrackingSpaceType true retourneert, heeft Unity het wereldcoördinaatsysteem omgeschakeld om het referentiekader van de fase te volgen.
  • Als SetTrackingSpaceType false retourneert, kan Unity niet overschakelen naar het referentiekader voor de fase, waarschijnlijk omdat de gebruiker geen verdieping heeft ingesteld in hun omgeving. Hoewel een valse retourwaarde niet gebruikelijk is, kan dit gebeuren als de fase in een andere ruimte is ingesteld en het apparaat naar de huidige ruimte wordt verplaatst zonder dat de gebruiker een nieuwe fase instelt.

Zodra uw app het ruimtetype RoomScale-tracering heeft ingesteld, wordt inhoud die op het y=0-vlak is geplaatst, weergegeven op de vloer. De oorsprong bij 0, 0, 0 is de specifieke plaats op de verdieping waar de gebruiker zich bevond tijdens het instellen van de ruimte, waarbij -Z de voorwaartse richting aangeeft waarmee ze tijdens de installatie werden geconfronteerd.

Naamruimte:UnityEngine.Experimental.XR
Type:Grens

In scriptcode kunt u vervolgens de methode TryGetGeometry aanroepen op het type UnityEngine.Experimental.XR.Boundary om een grensveelhoek op te halen, waarbij u het grenstype TrackedArea opgeeft. Als de gebruiker een grens heeft gedefinieerd (u krijgt een lijst met hoekpunten), is het veilig om een ervaring op ruimteschaal te bieden aan de gebruiker, waar deze de scène kan doorlopen die u maakt.

Notitie

Het systeem geeft de grens automatisch weer wanneer de gebruiker deze benadert. Uw app hoeft deze veelhoek niet te gebruiken om de grens zelf weer te geven. U kunt er echter voor kiezen om uw scèneobjecten in te delen met behulp van deze grensveelhoek, zodat de gebruiker deze objecten fysiek kan bereiken zonder te teleporteren:

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

Een ervaring op wereldschaal bouwen

Naamruimte:UnityEngine.XR.WSA
Type:WorldAnchor

Voor echte wereldwijde ervaringen op HoloLens waarmee gebruikers meer dan 5 meter kunnen rondlopen, hebt u nieuwe technieken nodig die verder gaan dan de technieken die worden gebruikt voor ervaringen op ruimteschaal. Een belangrijke techniek die u gebruikt, is het maken van een ruimtelijk anker om een cluster van hologrammen precies op hun plaats te vergrendelen in de fysieke wereld, ongeacht hoe ver de gebruiker heeft gerobberd, en deze hologrammen vervolgens in latere sessies opnieuw te vinden.

In Unity maakt u een ruimtelijk anker door het onderdeel WorldAnchor Unity toe te voegen aan een GameObject.

Een wereldanker toevoegen

Als u een wereldanker wilt toevoegen, roept u AddComponent<WorldAnchor>() aan op het gameobject met de transformatie die u in de echte wereld wilt verankeren.

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

Dat is alles. Dit spelobject wordt nu verankerd aan de huidige locatie in de fysieke wereld - mogelijk ziet u dat de Unity-wereldcoördinaten in de loop van de tijd enigszins worden aangepast om ervoor te zorgen dat fysieke uitlijning. Gebruik persistentie om deze verankerde locatie opnieuw te vinden in een toekomstige app-sessie.

Een wereldanker verwijderen

Als u het GameObject niet langer wilt vergrendelen op een fysieke locatie in de wereld en niet van plan bent om het in dit frame te verplaatsen, kunt u gewoon Destroy aanroepen op het onderdeel World Anchor.

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

Als u het GameObject dit frame wilt verplaatsen, moet u in plaats daarvan DestroyImmediate aanroepen.

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

Een world anchored gameobject verplaatsen

GameObject's kunnen niet worden verplaatst terwijl er een World Anchor op staat. Als u het GameObject dit frame wilt verplaatsen, moet u het volgende doen:

  1. DestroyImmediate the World Anchor component
  2. Het GameObject verplaatsen
  3. Voeg een nieuw World Anchor-onderdeel toe aan het GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Afhandeling van wijzigingen in de beschikbaarheid

Een WorldAnchor is misschien niet op een bepaald moment in de fysieke wereld te vinden. Als dat gebeurt, werkt Unity de transformatie van het verankerde object niet bij. Dit kan ook veranderen terwijl een app wordt uitgevoerd. Als de wijziging in de beschikbaarheid niet wordt verwerkt, wordt het object niet op de juiste fysieke locatie in de wereld weergegeven.

Op de hoogte worden gesteld van wijzigingen in de beschikbaarheid:

  1. Abonneren op de gebeurtenis OnTrackingChanged
  2. De gebeurtenis verwerken

De gebeurtenis OnTrackingChanged wordt aangeroepen wanneer het onderliggende ruimtelijke anker verandert tussen een status van locatable versus niet-locatable.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Verhandel vervolgens de gebeurtenis:

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

Soms bevinden ankers zich direct. In dit geval wordt deze eigenschap isLocated van het anker ingesteld op true wanneer AddComponent<WorldAnchor>() retourneert. Als gevolg hiervan wordt de gebeurtenis OnTrackingChanged niet geactiveerd. Een schoon patroon zou zijn om uw OnTrackingChanged-handler aan te roepen met de initiële Status IsLocated na het koppelen van een anker.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Ankers delen tussen apparaten

Gebruik Azure Spatial Anchors om een duurzaam cloudanker te maken van een lokale WorldAnchor, die uw app vervolgens kan vinden op meerdere HoloLens-, iOS- en Android-apparaten. Door een gemeenschappelijk ruimtelijk anker op meerdere apparaten te delen, kan elke gebruiker inhoud zien die ten opzichte van dat anker op dezelfde fysieke locatie wordt weergegeven. Dit maakt realtime gedeelde ervaringen mogelijk.

Probeer de quickstarts van Azure Spatial Anchors Unity om aan de slag te gaan met het bouwen van gedeelde ervaringen in Unity.

Zodra u aan de slag bent met Azure Spatial Anchors, kunt u ankers maken en zoeken in Unity.

Controlepunt volgende ontwikkeling

Als u het controlepunttraject voor Unity-ontwikkeling volgt dat we hebben uitgetekend, bent u bezig met het verkennen van de Mixed Reality belangrijkste bouwstenen. Vanaf hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar Mixed Reality platformmogelijkheden en API's:

U kunt altijd op elk gewenst moment teruggaan naar de controlepunten voor Unity-ontwikkeling .

Zie ook