Coördinatensystemen in Unity

Windows Mixed Reality biedt ondersteuning voor apps in een breed scala aan ervaringsschalen, van apps met alleen oriëntatie en op plaats schalen tot apps op ruimteschaal. Op HoloLens kunt u 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 op zittende schaal bouwen

Naamruimte: UnityEngine.XR
Type: XRDevice

Als u een ervaring met alleen-stand of op zittende schaal wilt bouwen, moet u Unity instellen op het type stationaire traceringsruimte. Ruimte voor stationair bijhouden stelt het wereldcoördinaatsysteem van Unity in om het stationaire referentieframe bij te houden. In de modus Stationair bijhouden wordt inhoud in de editor net vóór de standaardlocatie van de camera (forward 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 lieverding zouden deren), kunt u vervolgens XR instellen. InputTracking.disablePositionalTracking naar true:

InputTracking.disablePositionalTracking = true;

Voor een ervaring op zitschaal kunt u de XR aanroepen, zodat de gebruiker later de plaats van herkomst kan gebruiken. Methode InputTracking.Recenter:

InputTracking.Recenter();

Een ervaring op schaal of ruimte bouwen

Naamruimte: UnityEngine.XR
Type: XRDevice

Voor een ervaring op schaal of op 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 systeem voor wereldcoördinaten op vloerniveau, kunt u instellen en testen of Unity gebruik maakt van het ruimtetype Ruimte voor ruimte voor het bijhouden van 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 coördinatensysteem voor de wereld omgewisseld om het referentieframe bij te houden.
  • Als SetTrackingSpaceType onwaar retourneert, kan Unity niet overschakelen naar het referentieframe voor de fase, 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 naar de huidige ruimte wordt verplaatst zonder dat de gebruiker een nieuwe fase instelt.

Zodra uw app het ruimtetype voor ruimte 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 het instellen van de ruimte in de ruimte bevond, waarbij -Z de richting aandeed waar ze tijdens de installatie mee te maken hadden.

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 polygoon op te halen, waarbij een grenstype van 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 hij/zij de scène die u maakt kan rondlopen.

Notitie

Het systeem geeft de grens automatisch weer wanneer de gebruiker deze nadert. 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 polygoon, 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 wereldschaalervaring bouwen

Naamruimte: UnityEngine.XR.WSA
Type: WorldAnchor

Voor echte ervaringen op wereldschaal op HoloLens waarmee gebruikers meer dan 5 meter kunnen schalen, 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 Onderdeel WorldAnchor Unity toe te voegen aan een GameObject.

Een World Anchor toevoegen

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

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

Dat is alles. Dit game-object wordt nu verankerd in de huidige locatie in de fysieke wereld. Mogelijk ziet u dat de coördinaten van de Unity-wereld na een tijd enigszins worden aangepast 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 niet langer wilt dat het GameObject wordt vergrendeld op een fysieke locatie en u niet van plan bent om het te verplaatsen naar dit frame, 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.

Op de hoogte worden gesteld van wijzigingen in de lokabiliteit:

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

De gebeurtenis OnTrackingChanged wordt aangeroepen wanneer het onderliggende ruimtelijke anker verandert tussen een status die kan worden lokaliseren versus wanneer het onderliggende ruimtelijk anker 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 AddComponent () retourneert. 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 op meerdere 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 inhoud ten opzichte van dat anker op dezelfde fysieke locatie wordt weergegeven. Dit maakt realtime gedeelde ervaringen mogelijk.

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

Zodra u met 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 bespraken, bent u klaar om de belangrijkste bouwstenen Mixed Reality verkennen. Hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar Mixed Reality platformmogelijkheden en API's:

U kunt altijd teruggaan naar de Unity-ontwikkelcontrolepunten.

Zie ook