Delen via


Coördinaatsystemen in Unity

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

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

Een ervaring met alleen oriëntatie of zitschaal bouwen

Naamruimte: UnityEngine.XR
Type: XRDevice

Als u een ervaring met alleen standen of zitplaatsen wilt bouwen, moet u Unity instellen op het type stationaire traceringsruimte. Stationaire traceringsruimte stelt het wereldcoördinaatsysteem van Unity in om het stationaire referentiekader bij te houden. In de stationaire traceringsmodus 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-only ervaring zoals een videoviewer van 360 graden (waarbij positionele hoofdupdates de illusie zouden verpesten), kunt u vervolgens XR instellen . InputTracking.disablePositionalTracking naar true:

InputTracking.disablePositionalTracking = true;

Voor een ervaring met een zitschaal kunt u de XR aanroepen om de gebruiker later recenter de geplaatste oorsprong te laten aanroepen . Methode InputTracking.Recenter :

InputTracking.Recenter();

Een ervaring op schaal of ruimteschaal bouwen

Naamruimte: UnityEngine.XR
Type: XRDevice

Voor een ervaring op staande 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 door de gebruiker gedefinieerde oorsprong op vloerniveau en optionele ruimtegrens vertegenwoordigt, die tijdens de eerste uitvoering is ingesteld.

Om ervoor te zorgen dat Unity werkt met het wereldcoördinaatsysteem op verdiepingsniveau, kunt u instellen en testen of Unity gebruikmaakt van het ruimtetype Ruimte voor tracering 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 waar retourneert, heeft Unity het wereldcoördinaatsysteem gewijzigd om het referentieframe van de fase bij te houden.
  • Als SetTrackingSpaceType onwaar retourneert, kan Unity niet overschakelen naar het referentiekader voor fases, waarschijnlijk omdat de gebruiker geen vloer heeft ingesteld in hun omgeving. Hoewel een foutieve retourwaarde niet gebruikelijk is, kan het 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 instelt.

Zodra uw app het ruimtetype ruimte voor ruimte bijhouden van RoomScale heeft ingesteld, wordt de inhoud die op het y=0-vlak wordt geplaatst, weergegeven op de vloer. De oorsprong op 0, 0, 0 is de specifieke plaats op de vloer waar de gebruiker stond tijdens het instellen van de ruimte, met -Z die de voorwaartse richting vertegenwoordigt die ze tijdens de installatie hadden.

Naamruimte: UnityEngine.Experimental.XR
Type: Grens

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

Notitie

Het systeem geeft automatisch de grens 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 veelhoek om ervoor te zorgen dat de gebruiker deze objecten fysiek kan bereiken zonder 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 dwalen, hebt u nieuwe technieken nodig dan die worden gebruikt voor ervaringen op ruimteschaal. Een belangrijke techniek die u gebruikt, is om een ruimtelijk anker te maken om een cluster hologrammen nauwkeurig in de fysieke wereld te vergrendelen, ongeacht hoe ver de gebruiker heeft geroerd en die hologrammen vervolgens opnieuw te vinden in latere sessies.

In Unity maakt u een ruimtelijk anker door het WorldAnchor Unity-onderdeel 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 het! Dit gameobject wordt nu verankerd aan de huidige locatie in de fysieke wereld. Mogelijk ziet u dat de Unity-wereldcoördinaten enigszins in de loop van de tijd worden aangepast om ervoor te zorgen dat fysieke uitlijning wordt gegarandeerd. Gebruik persistentie om deze verankerde locatie opnieuw te vinden in een toekomstige app-sessie.

Een wereldanker verwijderen

Als u niet langer wilt dat het GameObject is vergrendeld op een fysieke wereldlocatie en niet van plan bent om 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 DestroyImmediate in plaats daarvan 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>();

Wijzigingen in locatability verwerken

Een WorldAnchor is op een bepaald moment mogelijk niet te locatable in de fysieke wereld. 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 verkaatbaarheid niet kan worden verwerkt, wordt het object niet weergegeven op de juiste fysieke locatie ter wereld.

U ontvangt een melding over wijzigingen in de verkazing:

  1. Abonneren op de onTrackingChanged-gebeurtenis
  2. De gebeurtenis afhandelen

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

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Voer 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 onmiddellijk. In dit geval wordt deze eigenschapLocated van het anker ingesteld op true wanneer AddComponent<WorldAnchor>() retourneert. Als gevolg hiervan wordt de Gebeurtenis OnTrackingChanged niet geactiveerd. Een schoon patroon is 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 op verschillende apparaten

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

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 vinden in Unity.

Volgend controlepunt voor ontwikkeling

Als u het controlepunt voor Unity-ontwikkeling volgt dat we hebben opgesteld, bevindt u zich midden in het verkennen van de bouwstenen van mixed reality-kernen. Vanaf hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar de mogelijkheden en API's van het Mixed Reality-platform:

U kunt altijd op elk gewenst moment teruggaan naar de Unity-ontwikkelingscontrolepunten .

Zie ook