Koordinatensysteme in UnityCoordinate systems in Unity

Windows Mixed Reality unterstützt Apps über eine Vielzahl von SkalierungsMöglichkeiten hinweg, von ausgerichteten und skalierbaren apps bis hin zu hochskalierbaren apps.Windows Mixed Reality supports apps across a wide range of experience scales, from orientation-only and seated-scale apps up through room-scale apps. Auf hololens können Sie weitere apps erstellen und Apps erstellen, mit denen Benutzer mehr als 5 Meter durchlaufen können, indem Sie eine ganze Etage eines Builds und darüber hinaus untersuchen.On HoloLens, you can go further and build world-scale apps that let users walk beyond 5 meters, exploring an entire floor of a building and beyond.

Der erste Schritt beim Aufbau einer gemischten Realität in Unity besteht darin, zu bestimmen , welche Benutzer Oberfläche Ihre APP als Ziel hat.Your first step in building a mixed reality experience in Unity is to determine which experience scale your app will target.

Aufbauen einer reinen Orientierung oder einer Skalierungs FunktionBuilding an orientation-only or seated-scale experience

Namespace: unityengine. XRNamespace: UnityEngine.XR
Typ: xrdeviceType: XRDevice

Zum Erstellen einer reinen Orientierung oder einer Skalierungs Funktion müssen Sie Unity auf den Typ des stationären nach Verfolgungs Raums festlegen.To build an orientation-only or seated-scale experience, you need to set Unity to the Stationary tracking space type. Stationärer nach Verfolgungs Raum legt das World-Koordinatensystem von Unity fest, um den stationären Verweis Rahmenzu verfolgen.Stationary tracking space sets Unity's world coordinate system to track the stationary frame of reference. Im Modus der stationären Nachverfolgung wird der Inhalt, der direkt vor dem Standard Speicherort der Kamera (vorwärts ist-Z) im Editor eingefügt wird, vor dem Benutzer angezeigt, wenn die APP gestartet wird.In the Stationary tracking mode, content placed in the editor just in front of the camera's default location (forward is -Z) will appear in front of the user when the app launches.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Namespace: unityengine. XRNamespace: UnityEngine.XR
Typ: inputtrackingType: InputTracking

Bei einer reinen Orientierung , z. b. bei einem Video Viewer mit einem 360-Grad (bei dem Positions Aktualisierungen die Illusion zerstören würden), können Sie "XR" festlegen . Inputtracking. disablepositionaltracking auf true:For a pure orientation-only experience such as a 360-degree video viewer (where positional head updates would ruin the illusion), you can then set XR.InputTracking.disablePositionalTracking to true:

InputTracking.disablePositionalTracking = true;

Um dem Benutzer die Möglichkeit zu geben, den sitzenden Ursprung zu einem späteren Zeitpunkt wieder einzugeben, können Sie den XR-Vorgang für eine Benutzer freundliche Skalierung durchführen . Inputtracking. recenter -Methode:For a seated-scale experience, to let the user later recenter the seated origin, you can call the XR.InputTracking.Recenter method:

InputTracking.Recenter();

Aufbauen einer Dauer-oder Raum SkalierungBuilding a standing-scale or room-scale experience

Namespace: unityengine. XRNamespace: UnityEngine.XR
Typ: xrdeviceType: XRDevice

Für eine Dauer- oder Raum Skalierung müssen Sie Inhalte in Relation zum Boden platzieren.For a standing-scale or room-scale experience, you'll need to place content relative to the floor. Sie haben eine Begründung für den Benutzer, der die räumliche Phase verwendet, die den definierten Ursprung und die optionale Raumgrenze des Benutzers darstellt, die während der ersten Durchführung eingerichtet wird.You reason about the user's floor using the spatial stage, which represents the user's defined floor-level origin and optional room boundary, set up during first run.

Um sicherzustellen, dass Unity mit dem globalen Koordinatensystem auf Grundebene betrieben wird, können Sie festlegen und testen, ob Unity den Bereich für die nach Verfolgungs Fläche von roomscale verwendet:To ensure that Unity is operating with its world coordinate system at floor-level, you can set and test that Unity is using the RoomScale tracking space type:

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.
}
  • Wenn settrackingspacetype true zurückgibt, hat Unity das World-Koordinatensystem erfolgreich umgestellt, um den stagingframe des Verweisesnachzuverfolgen.If SetTrackingSpaceType returns true, Unity has successfully switched its world coordinate system to track the stage frame of reference.
  • Wenn settrackingspacetype false zurückgibt, konnte Unity nicht in den stagingframe des Verweises wechseln. Dies liegt wahrscheinlich daran, dass der Benutzer keine Etage in der Umgebung eingerichtet hat.If SetTrackingSpaceType returns false, Unity was unable to switch to the stage frame of reference, likely because the user has not set up a floor in their environment. Obwohl ein falscher Rückgabewert nicht häufig vorkommt, kann dies vorkommen, wenn die Stufe in einem anderen Raum eingerichtet ist und das Gerät in den aktuellen Raum verschoben wird, ohne dass der Benutzer eine neue Stufe einrichten muss.While a false return value isn't common, it can happen if the stage is set up in a different room and the device is moved to the current room without the user setting up a new stage.

Nachdem Ihre APP den Typ für die Nachverfolgung von roomscale festgelegt hat, wird der Inhalt auf der Ebene "y = 0" auf der Etage angezeigt.Once your app successfully sets the RoomScale tracking space type, content placed on the y=0 plane will appear on the floor. Der Ursprung bei 0, 0, 0 ist die spezifische Stelle auf dem Boden, an der der Benutzer während der Raumeinrichtung Stand, wobei-Z die Vorwärtsrichtung darstellt, die während des Setups aufgetreten ist.The origin at 0, 0, 0 will be the specific place on the floor where the user stood during room setup, with -Z representing the forward direction they were facing during setup.

Namespace: unityengine. experimental. XRNamespace: UnityEngine.Experimental.XR
Typ: GrenzeType: Boundary

Im Skriptcode können Sie dann die trygetgeometry-Methode für den Typ unityengine. experimental. XR. Boundary aufrufen, um ein Grenz Polygon abzurufen und dabei den Grenztyp trackedarea anzugeben.In script code, you can then call the TryGetGeometry method on the UnityEngine.Experimental.XR.Boundary type to get a boundary polygon, specifying a boundary type of TrackedArea. Wenn der Benutzer eine Grenze definiert hat (Sie erhalten eine Liste mit Scheitel Punkten), ist es sicher, dem Benutzer eine Raum Umgebung bereitzustellen, in der Sie die von Ihnen erstellte Szene durchlaufen können.If the user defined a boundary (you get back a list of vertices), it's safe to deliver a room-scale experience to the user, where they can walk around the scene you create.

Hinweis

Das System gibt die Grenze automatisch aus, wenn der Benutzer es nähert.The system will automatically render the boundary when the user approaches it. Ihre APP muss dieses Polygon nicht verwenden, um die Grenze selbst zu erzeugen.Your app doesn't need to use this polygon to render the boundary itself. Allerdings können Sie Ihre Szenen Objekte mithilfe dieses Begrenzungs Polygons anordnen, um sicherzustellen, dass der Benutzer diese Objekte physisch ohne teleportierung erreichen kann:However, you may choose to lay out your scene objects using this boundary polygon, to ensure the user can physically reach those objects without teleporting:

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

Entwickeln eines weltweiten ErlebnissesBuilding a world-scale experience

Namespace: unityengine. XR. WSANamespace: UnityEngine.XR.WSA
Typ: worldanchorType: WorldAnchor

Für echte Welt weite Oberflächen in hololens, mit denen Benutzer mehr als 5 Meter bewegen können, benötigen Sie neue Techniken, die über diejenigen hinausgehen, die für Raum Skalierungen verwendet werden.For true world-scale experiences on HoloLens that let users wander beyond 5 meters, you'll need new techniques beyond those used for room-scale experiences. Ein wichtiges Verfahren, das Sie verwenden, besteht darin, einen räumlichen Anker zu erstellen, mit dem ein Cluster von holograms genau in der physischen Welt gesperrt wird, unabhängig davon, wie weit der Benutzer rostet hat, und diese Hologramme in späteren Sitzungen erneut finden.One key technique you'll use is to create a spatial anchor to lock a cluster of holograms precisely in place in the physical world, no matter how far the user has roamed, and then find those holograms again in later sessions.

In Unity erstellen Sie einen räumlichen Anker durch Hinzufügen der Unity-Komponente worldanchor zu einem gameobject-Objekt.In Unity, you create a spatial anchor by adding the WorldAnchor Unity component to a GameObject.

Hinzufügen eines Welt AnkersAdding a World Anchor

Um einen Welt Anker hinzuzufügen, nennen Sie addComponent () für das Game-Objekt mit der Transformation, die Sie in der realen Welt verankern möchten.To add a world anchor, call AddComponent() on the game object with the transform you want to anchor in the real world.

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

Das ist alles!That's it! Dieses Spielobjekt wird nun an seinem aktuellen Speicherort in der physischen Welt verankert. möglicherweise werden die Unity-Weltkoordinaten im Laufe der Zeit leicht angepasst, um die physische Ausrichtung sicherzustellen.This game object will now be anchored to its current location in the physical world - you may see its Unity world coordinates adjust slightly over time to ensure that physical alignment. Verwenden Sie Persistenz , um diesen verankerten Standort in einer zukünftigen App-Sitzung wieder zu suchen.Use persistence to find this anchored location again in a future app session.

Entfernen eines Welt AnkersRemoving a World Anchor

Wenn Sie nicht mehr möchten, dass das gameobject-Objekt an eine physische Welt Stelle gesperrt ist, und Sie dieses Frame nicht verschieben möchten, können Sie einfach "zerstören" für die "World Anchor"-Komponente aufzurufen.If you no longer want the GameObject locked to a physical world location and don't intend on moving it this frame, then you can just call Destroy on the World Anchor component.

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

Wenn Sie das gameobject-Objekt in diesen Frame verschieben möchten, müssen Sie stattdessen destroyimmediate aufzurufen.If you want to move the GameObject this frame, you need to call DestroyImmediate instead.

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

Verschieben eines weltweit verankerten gameobjectMoving a World Anchored GameObject

Gameobject kann nicht verschoben werden, wenn ein Welt Anker darauf liegt.GameObject's cannot be moved while a World Anchor is on it. Wenn Sie das gameobject für diesen Frame verschieben müssen, müssen Sie Folgendes ausführen:If you need to move the GameObject this frame, you need to:

  1. Destroyimmediate der Welt Anker KomponenteDestroyImmediate the World Anchor component
  2. Verschieben des gameobjectMove the GameObject
  3. Fügen Sie dem gameobject eine neue Welt Anker Komponente hinzu.Add a new World Anchor component to the GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Behandeln von Änderungen an der Anwendungs FreundlichkeitHandling Locatability Changes

Ein worldanchor kann nicht in der physischen Welt zu einem bestimmten Zeitpunkt einstellbar sein.A WorldAnchor may not be locatable in the physical world at a point in time. Wenn dies der Fall ist, wird Unity die Transformation des verankerten Objekts nicht aktualisieren.If that occurs, Unity won't be updating the transform of the anchored object. Dies kann sich auch ändern, während eine app ausgeführt wird.This also can change while an app is running. Wenn Sie die Änderung der loerability nicht bewältigen, wird das Objekt nicht am richtigen physischen Speicherort der Welt angezeigt.Failure to handle the change in locatability will cause the object to not appear in the correct physical location in the world.

So erhalten Sie eine Benachrichtigung über die Änderungen der Änderungen:To be notified about locatability changes:

  1. Ontrackingchanged-Ereignis abonnierenSubscribe to the OnTrackingChanged event
  2. Behandeln des EreignissesHandle the event

Das ontrackingchanged -Ereignis wird immer dann aufgerufen, wenn sich der zugrunde liegende räumliche Anker zwischen dem Zustand "verwendbar" und "nicht zu verwendbar" ändert.The OnTrackingChanged event will be called whenever the underlying spatial anchor changes between a state of being locatable vs. not being locatable.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Behandeln Sie dann das-Ereignis:Then handle the event:

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

Manchmal werden Anker sofort gefunden.Sometimes anchors are located immediately. In diesem Fall wird diese islocated-Eigenschaft des Ankers auf true festgelegt, wenn addComponent () zurückgibt.In this case, this isLocated property of the anchor will be set to true when AddComponent() returns. Folglich wird das ontrackingchanged-Ereignis nicht ausgelöst.As a result, the OnTrackingChanged event won't be triggered. Ein sauberes Muster besteht darin, den ontrackingchanged-Handler mit dem ursprünglichen ISSE-Zustand nach dem Anfügen eines Ankers aufzurufen.A clean pattern would be to call your OnTrackingChanged handler with the initial IsLocated state after attaching an anchor.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Gemeinsame Nutzung von Ankern GerätenSharing anchors across devices

Verwenden Sie räumliche Azure-Anker , um einen permanenten cloudanker von einem lokalen worldanchor zu erstellen, den Ihre APP dann über mehrere hololens-, IOS-und Android-Geräte hinweg finden kann.Use Azure Spatial Anchors to create a durable cloud anchor from a local WorldAnchor, which your app can then locate across multiple HoloLens, iOS and Android devices. Durch die gemeinsame Nutzung eines gemeinsamen räumlichen Ankers auf mehreren Geräten kann jeder Benutzer den Inhalt in Relation zu diesem Anker am gleichen physischen Speicherort sehen.By sharing a common spatial anchor across multiple devices, each user can see content rendered relative to that anchor in the same physical location. Dies ermöglicht gemeinsame Erfahrungen in Echtzeit.This allows for real-time shared experiences.

Um mit der Einführung von freigegebenen Erfahrungen in Unity zu beginnen, testen Sie die fünfminütigen Azure Spatial Anchor Unity-Schnellstarts.To get started building shared experiences in Unity, try out the 5-minute Azure Spatial Anchors Unity quickstarts.

Sobald Sie mit räumlichen Azure-Ankern arbeiten, können Sie Anker in Unity erstellen und lokalisieren.Once you're up and running with Azure Spatial Anchors, you can then create and locate anchors in Unity.

Nächster EntwicklungsprüfpunktNext Development Checkpoint

Wenn Sie der Unity-Entwicklungs Prüf Punkt Journey folgen, die wir gerade angelegt haben, sind Sie in der Mitte, dass Sie die Grundbausteine der gemischten Realität erkunden.If you're following the Unity development checkpoint journey we've laid out, you're in the midst of exploring the Mixed Reality core building blocks. Von hier aus können Sie mit dem nächsten Baustein fortfahren:From here, you can continue to the next building block:

Oder fahren Sie mit den Funktionen und APIs der Mixed Reality-Plattform fort:Or jump to Mixed Reality platform capabilities and APIs:

Sie können jederzeit zu den Prüfpunkten für die Unity-Entwicklung zurückkehren.You can always go back to the Unity development checkpoints at any time.

Weitere InformationenSee Also