Coördinatensystemen in Unity

Windows Mixed Reality biedt ondersteuning voor apps in een breed scala aan ervaringsschalen, van apps met alleen stand en op plaats schalen tot apps op ruimteschaal. Aan HoloLens kunt u nog verder gaan en grootschalige apps bouwen die gebruikers meer dan 5 meter laten lopen en een hele verdieping van een gebouw en daarbuiten verkennen.

Uw eerste stap bij het bouwen van mixed reality ervaring in Unity is het begrijpen van coördinatensystemen en het kiezen van de ervaringsschaal die uw app als doel heeft.

Een ervaring met alleen-oriëntatie of zittend schalen bouwen

Naamruimte:UnityEngine.XR
Type:XRDevice

Als u een ervaring met alleen stand ofseated-scale wilt bouwen, moet u Unity instellen op het type stationaire traceringsruimte. Stationaire traceringsruimte stelt het wereldcoördinatensysteem van Unity in om het stationaire referentieframe bij te houden. In de modus Stationair bijhouden wordt inhoud die in de editor wordt geplaatst, net vóór de standaardlocatie van de camera (doorsturen is -Z) voor de gebruiker weergegeven wanneer de app wordt geactiveerd.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Naamruimte:UnityEngine.XR
Type:InputTracking

Voor een pure stand-only ervaring, zoals een videoviewer van 360 graden (waarbij positionele hoofdupdates de overdurf zouden zijn), kunt u vervolgens XR instellen. InputTracking.disablePositionalTracking naar true:

InputTracking.disablePositionalTracking = true;

Als u de gebruiker later de plaats van de plaats van herkomst wilt laten gebruiken, kunt u de XR aanroepen voor een ervaring op basis van zittend schalen. Methode InputTracking.Recenter :

InputTracking.Recenter();

Een ervaring op een permanente schaal of ruimteschaal bouwen

Naamruimte:UnityEngine.XR
Type:XRDevice

Voor een ervaring op eenpermanente schaal of ruimteschaal 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 vloerniveau en optionele ruimtegrens van de gebruiker vertegenwoordigt, die tijdens de eerste uitvoering is ingesteld.

Om ervoor te zorgen dat Unity werkt met het wereldcoördinatensysteem op vloerniveau, kunt u instellen en testen of Unity gebruik maakt van het traceringsruimtetype 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.
}
  • Als SetTrackingSpaceType true retourneert, heeft Unity het wereldcoördinatensysteem omgewisseld om het referentieframe bij te houden.
  • Als SetTrackingSpaceType false retourneert, kon Unity niet overschakelen naar het referentieframe, waarschijnlijk omdat de gebruiker geen verdieping in zijn omgeving heeft ingesteld. Hoewel een onwaar retourwaarde niet gebruikelijk is, kan dit gebeuren als de fase is ingesteld in een andere ruimte en het apparaat wordt verplaatst naar de huidige ruimte zonder dat de gebruiker een nieuwe fase hoeft in te stellen.

Zodra uw app het ruimtetype Voor het bijhouden van RoomScale heeft bepaald, wordt inhoud op het vlak y=0 op de vloer weergegeven. De oorsprong bij 0, 0, 0 is de specifieke plaats op de verdieping waar de gebruiker zich tijdens de installatie van de ruimte in de ruimte bevond, waarbij -Z de richting naar voren wefde tijdens de installatie.

Naamruimte:UnityEngine.Experimental.XR
Type:Grens

In scriptcode kunt u vervolgens de methode TryGetGeometry aanroepen op het type UnityEngine.Experimental.XR.Boundary om een grens-veelhoek op te halen, waarbij het grenstype TrackedArea wordt opgegeven. Als de gebruiker een grens heeft gedefinieerd (u krijgt een lijst met vertices terug), is het veilig om de gebruiker een ervaring op ruimteschaal te bieden, waar ze de scène die u maakt, kunnen rondlopen.

Notitie

De grens wordt automatisch weergegeven 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 grens-veelhoek, om ervoor te zorgen dat 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 ervaringen op wereldschaal op HoloLens waarmee gebruikers meer dan 5 meter kunnen lopen, hebt u nieuwe technieken nodig die verder gaan dan de technieken die worden gebruikt voor ervaringen op ruimteschaal. Een belangrijke techniek die u gaat gebruiken, is het maken van een ruimtelijk anker om een cluster hologrammen nauwkeurig te vergrendelen in de fysieke wereld, ongeacht hoe ver de gebruiker heeft ge roamed, en deze hologrammen vervolgens in latere sessies opnieuw te vinden.

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

Een World Anchor toevoegen

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

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

Dat is alles. Dit gameobject wordt nu verankerd in de huidige locatie in de fysieke wereld. Mogelijk worden de Unity-wereldcoördinaten iets aangepast in de tijd om ervoor te zorgen dat de fysieke uitlijning wordt gegarandeerd. Gebruik persistentie om deze ankerlocatie opnieuw te vinden in een toekomstige app-sessie.

Een World Anchor verwijderen

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

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 kan 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>();

Lokabiliteitswijzigingen verwerken

Een WorldAnchor is op een bepaald moment mogelijk niet te vinden in de fysieke wereld. Als dat het geval is, wordt de transformatie van het ankerobject niet bijgewerkt door Unity. Dit kan ook veranderen wanneer een app wordt uitgevoerd. Als de wijziging in de lokabiliteit niet wordt verwerkt, wordt het object niet weergegeven op de juiste fysieke locatie ter wereld.

Als u op de hoogte wilt worden gesteld van wijzigingen in de locatability:

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

De gebeurtenis OnTrackingChanged wordt aangeroepen wanneer het onderliggende ruimtelijk anker verandert tussen een status die kan worden opzoekbaar of niet kan worden lokaliseren.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Ver handelen vervolgens de gebeurtenis af:

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 AddComponentWorldAnchor<>() terugkeert. Als gevolg hiervan wordt de gebeurtenis OnTrackingChanged niet geactiveerd. Een schoon patroon is het aanroepen van uw OnTrackingChanged-handler met de initiële status IsLocated nadat een anker is gekoppeld.

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 zien dat er inhoud wordt weergegeven ten opzichte van dat anker op dezelfde fysieke locatie. Dit maakt realtime gedeelde ervaringen mogelijk.

Als u aan de slag wilt gaan met het bouwen van gedeelde ervaringen in Unity, kunt u de quickstarts van 5 minuten voor Azure Spatial Anchors Unity uitproberen.

Zodra u azure-Spatial Anchors, kunt u ankers maken en vinden in Unity.

Volgende controlepunt voor ontwikkeling

Als u het traject van het Unity-controlepunt voor ontwikkeling volgt dat we hebben verkend, bent u bezig met het verkennen van Mixed Reality bouwstenen. Hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar Mixed Reality platformmogelijkheden en API's:

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

Zie ook