Es ist ein großer Teil der Erstellung Mixed Reality Anwendungen, damit Ihre Hologramme an Ort und Stelle bleiben, sich mit Ihnen bewegen oder sich in einigen Fällen relativ zu anderen Hologrammen positionieren. Dieser Artikel führt Sie durch unsere empfohlene Lösung mithilfe von World Locking Tools, aber wir behandeln auch das manuelle Einrichten von Raumankern in Ihren Unity-Projekten. Bevor wir uns mit Code vertraut machen, ist es wichtig zu verstehen, wie Unity den Koordinatenraum und die Anker in seiner eigenen Engine behandelt.
Koordinatensysteme im Weltmaßstab
Heute, wenn Spiele, Datenvisualisierungs-Apps oder Virtual Reality-Apps geschrieben werden, besteht der typische Ansatz darin, ein absolutes Weltkoordinatensystem zu schaffen, zu dem alle anderen Koordinaten zuverlässig zuordnen können. In dieser Umgebung können Sie immer eine stabile Transformation finden, die eine Beziehung zwischen zwei beliebigen Objekten in dieser Welt definiert. Wenn Sie diese Objekte nicht verschoben haben, bleiben ihre relativen Transformationen immer gleich. Diese Art von globalem Koordinatensystem ist leicht richtig zu bekommen, wenn Sie eine rein virtuelle Welt rendern, in der Sie die gesamte Geometrie im Voraus kennen. VR-Apps auf Raummaßstab etablieren heute in der Regel ein absolutes Koordinatensystem auf Raummaßstab mit seinem Ursprung auf dem Boden.
Im Gegensatz dazu verfügt ein ungebundenes Mixed Reality-Gerät wie HoloLens über ein dynamisches sensorgesteuertes Verständnis der Welt, das sein Wissen über die Umgebung des Benutzers im Laufe der Zeit kontinuierlich anpasst, während er viele Meter über eine ganze Etage eines Gebäudes geht. Wenn Sie in einer Weltumgebung alle Hologramme in einem naiven starren Koordinatensystem platzieren, würden diese Hologramme im Laufe der Zeit driften, entweder basierend auf der Welt oder relativ zueinander.
Beispielsweise kann das Headset derzeit glauben, dass zwei Standorte in der Welt 4 Meter voneinander entfernt sind, und dann dieses Verständnis später verfeinern und lernen, dass die Standorte tatsächlich 3,9 Meter voneinander entfernt sind. Wenn diese Hologramme zunächst 4 Meter in einem einzigen starren Koordinatensystem platziert worden wären, würde eines von ihnen dann immer 0,1 Meter von der realen Welt entfernt erscheinen.
Sie können Raumanker manuell in Unity platzieren, um die Position eines Hologramms in der physischen Welt beizubehalten, wenn der Benutzer mobil ist. Dies opfert jedoch die Selbstkonsistenz innerhalb der virtuellen Welt. Verschiedene Anker bewegen sich ständig in Beziehung zueinander und bewegen sich auch durch den globalen Koordinatenraum. In diesem Szenario werden einfache Aufgaben wie das Layout schwierig. Auch physikalische Simulationen können problematisch sein.
World Locking Tools (WLT) bringt Ihnen das Beste aus beiden Welten und stabilisiert ein einzelnes starres Koordinatensystem mithilfe einer internen Versorgung von Raumankern, die über die virtuelle Szene verteilt sind, während sich der Benutzer bewegt. WLT analysiert die Koordinaten der Kamera und diese Raumanker jeden Frame. Anstatt die Koordinaten von allem auf der Welt zu ändern, um die Korrekturen in den Koordinaten des Kopfes des Benutzers zu kompensieren, korrigiert WLT stattdessen nur die Koordinaten des Kopfs.
Wählen Sie Ihren World Locking-Ansatz
Verwenden Sie nach Möglichkeit World Locking Tools für die Positionierung von Hologrammen.
World Locking Tools bietet ein stabiles Koordinatensystem, das die sichtbaren Inkonsistenzen zwischen virtuellen und realen Markern minimiert. World Locking Tools sperrt die gesamte Szene mit einem freigegebenen Ankerpool, anstatt jede Gruppe von Objekten mit dem eigenen individuellen Anker der Gruppe zu sperren.
World Locking Tools übernimmt automatisch die interne Erstellung und Verwaltung von Raumankern. Sie müssen nicht mit ARAnchorManager oder WorldAnchor interagieren, um Ihre Hologramme weltgebunden zu halten.
Verwenden Sie für Unity 2019/2020 mit OpenXR oder dem Windows XR-Plug-In ARAnchorManager.
Verwenden Sie für ältere Unity-Versionen oder WSA-Projekte WorldAnchor.
Laden Sie für die ersten Schritte mit den World Locking Tools das Mixed Reality Feature Tool herunter. Weitere Informationen zu den Grundlagen finden Sie auf der Dokumentationsseite zu Standard World Locking Tools links zu Übersicht, Schnellstart und anderen nützlichen Themen.
Wenn Ihr Projekt einsatzbereit ist, führen Sie das Hilfsprogramm "Szenen konfigurieren" über Mixed Reality > World Locking Tools aus:
Wichtig
Das Hilfsprogramm zum Konfigurieren der Szene kann jederzeit erneut ausgeführt werden. Es sollte zum Beispiel erneut ausgeführt werden, wenn das AR-Ziel von „Legacy“ in „XR SDK“ geändert wurde. Wenn die Szene bereits ordnungsgemäß konfiguriert ist, hat die Ausführung des Hilfsprogramms keinerlei Auswirkungen.
Schnellansichten
Während der frühen Entwicklung kann das Hinzufügen von Schnellansichten hilfreich sein, um sicherzustellen, dass WLT ordnungsgemäß eingerichtet und funktioniert. Sie können zur Verbesserung der Produktionsleistung oder wenn sie aus irgendeinem Grund nicht mehr benötigt werden, mit dem Hilfsprogramm „Remove visualizers“ (Visualisierungen entfernen) entfernt werden. Weitere Informationen zu den Visualisierungen finden Sie in der Dokumentation zu den Tools.
Das Mixed Reality OpenXR-Plug-In stellt grundlegende Ankerfunktionen über eine Implementierung von ARFoundation ARAnchorManager von Unity bereit. Informationen zu ARAnchors in ARFoundation finden Sie im ARFoundation-Handbuch für AR Anchor Manager.
In älteren Unity-Versionen erstellen Sie einen Raumanker, indem Sie die WorldAnchor Unity-Komponente zu einem GameObject hinzufügen.
Hinzufügen eines Weltankers
Um einen Weltanker hinzuzufügen, rufen Sie AddComponent<WorldAnchor>() das Spielobjekt mit der Transformation auf, die Sie in der realen Welt verankern möchten.
Dieses Spielobjekt ist nun an seinem aktuellen Standort in der physischen Welt verankert. Möglicherweise werden die Unity-Weltkoordinaten im Laufe der Zeit leicht angepasst, um die physische Ausrichtung sicherzustellen. Weitere Informationen finden Sie unter Laden eines Weltankers , um diesen verankerten Standort in einer zukünftigen App-Sitzung wieder zu finden.
Entfernen eines Weltankers
Wenn Sie nicht mehr möchten, dass die GameObject an einem physischen Weltstandort gebunden ist und sie nicht in diesem Frame verschoben werden soll, rufen Sie Destroy die World Anchor-Komponente auf.
Destroy(gameObject.GetComponent<WorldAnchor>());
Wenn Sie diesen GameObject Frame verschieben möchten, rufen Sie stattdessen auf DestroyImmediate .
Ein Weltanker kann in der physischen Welt zu einem bestimmten Zeitpunkt möglicherweise nicht gefunden werden. Unity aktualisiert dann die Transformation des verankerten Objekts nicht. Diese Situation kann auch während der Ausführung einer App auftreten. Wenn die Änderung der Locatability nicht behandelt wird, wird das Objekt nicht an der richtigen physischen Position der Welt angezeigt.
So werden Sie über Änderungen an der Locatability benachrichtigt:
Abonnieren Sie das OnTrackingChanged Ereignis. Das OnTrackingChanged Ereignis wird immer dann aufgerufen, wenn sich der zugrunde liegende Raumanker zwischen dem Zustand als auflösbar oder nicht verwertbar ändert.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Wenn Anker sofort gefunden werden, wird die isLocated -Eigenschaft des Ankers bei rückgaben auf trueAddComponent<WorldAnchor>() festgelegt. Daher wird das OnTrackingChanged Ereignis nicht ausgelöst. Ein übersichtlicheres Muster besteht darin, den OnTrackingChanged Handler mit dem Anfangszustand IsLocated nach dem Anfügen eines Ankers aufzurufen.
Raumanker speichern Hologramme im realen Raum zwischen Anwendungssitzungen. Nach dem Speichern im HoloLens-Ankerspeicher können Raumanker in verschiedenen Sitzungen gefunden und geladen werden und sind ein idealer Fallback, wenn keine Internetverbindung besteht.
Wichtig
Lokale Anker werden auf dem Gerät gespeichert, während Azure-Raumanker in der Cloud gespeichert werden. Sie können lokale und Azure-Anker ohne Konflikte im selben Projekt verwenden. Weitere Informationen zum Integrieren von Azure-Clouddiensten zum Speichern Ihrer Anker finden Sie unter Azure Spatial Anchors.
Standardmäßig stellen World Locking Tools das Koordinatensystem von Unity relativ zur physischen Welt über Sitzungen auf Geräten wieder her, die die Persistenz lokaler Raumanker unterstützen. Damit ein Hologramm nach dem Beenden und erneuten Ausführen der Anwendung an derselben Stelle in der physischen Welt angezeigt wird, muss die Anwendung nur die gleiche Pose im Hologramm wiederherstellen.
Wenn die Anwendung eine genauere Steuerung benötigt, können Sie das automatische Speichern und das automatische Laden im Inspektor deaktivieren und die Persistenz über ein Skript verwalten. Weitere Informationen finden Sie unter Beibehalten räumlicher Koordinatensysteme.
World Locking Tools unterstützt die lokale Ankerpersistenz nur auf HoloLens-Geräten. Integrieren Sie für Android-, iOS- und HoloLens-Geräte in Azure Spatial Anchors, um die Persistenz und freigabe von Koordinatenräumen über Sitzungen und Geräte hinweg zu unterstützen. Weitere Informationen und Beispiele zur Verwendung von World Locking Tools mit Azure Spatial Anchors finden Sie unter World Locking Tools (WLT) in Kombination mit Azure Spatial Anchors (ASA).
Eine API mit dem Namen ermöglicht das XRAnchorStore Beibehalten von Ankern zwischen Sitzungen. Ist XRAnchorStore eine Darstellung der gespeicherten Anker auf einem Gerät. Sie können Anker aus ARAnchors der Unity-Szene beibehalten, Anker aus dem Speicher in neue ARAnchorsladen oder Anker aus dem Speicher löschen.
Hinweis
Sie speichern und laden diese Anker auf demselben Gerät. Geräteübergreifende Anker werden über Azure Spatial Anchors unterstützt.
Namespaces
Für Unity 2020 und OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
oder Unity 2019/2020 + Windows XR-Plug-In:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Öffentliche Methoden
{
// A list of all persisted anchors, which can be loaded.
public IReadOnlyList<string> PersistedAnchorNames { get; }
// Clear all persisted anchors
public void Clear();
// Load a single persisted anchor by name. The ARAnchorManager will create this new anchor and report it in
// the ARAnchorManager.anchorsChanged event. The TrackableId returned here is the same TrackableId the
// ARAnchor will have when it is instantiated.
public TrackableId LoadAnchor(string name);
// Attempts to persist an existing ARAnchor with the given TrackableId to the local store. Returns true if
// the storage is successful, false otherwise.
public bool TryPersistAnchor(TrackableId id, string name);
// Removes a single persisted anchor from the anchor store. This will not affect any ARAnchors in the Unity
// scene, only the anchors in storage.
public void UnpersistAnchor(string name);
}
Abrufen einer Ankerspeicherreferenz
Um den XRAnchorStore mit Unity 2020 und OpenXR zu laden, verwenden Sie die Erweiterungsmethode für das XRAnchorSubsystem, das Subsystem eines ARAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Um den XRAnchorStore mit Unity 2019/2020 und dem Windows XR-Plug-In zu laden, verwenden Sie die Erweiterungsmethode auf dem XRReferencePointSubsystem (Unity 2019) oder XRAnchorSubsystem (Unity 2020), dem Subsystem eines ARReferencePointManager/ARAnchorManager:
// Unity 2019 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRReferencePointSubsystem anchorSubsystem);
// Unity 2020 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem);
Laden eines Ankerspeichers
Um einen Ankerspeicher in Unity 2020 und OpenXR zu laden, greifen Sie über das Subsystem eines ARAnchorManagers wie folgt darauf zu:
Ein vollständiges Beispiel für beibehaltende/unpersistierende Anker finden Sie im Skript Anchors –> Anchors Sample GameObject und AnchorsSample.cs in der [Mixed Reality OpenXR-Plug-In-Beispielszene](():https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples
Verwenden Sie WorldAnchor, um Hologrammpersistenz in älteren Unity-Versionen oder WSA-Projekten zu gewährleisten.
Der WorldAnchorStore erstellt holografische Erfahrungen, bei denen Hologramme in bestimmten realen Positionen in allen Instanzen der Anwendung verbleiben. Benutzer können einzelne Hologramme anheften, wo immer sie möchten, und sie später an derselben Stelle über App-Sitzungen finden.
Mit WorldAnchorStore können Sie den Standort der Weltanker über Sitzungen hinweg beibehalten. Um Hologramme über Sitzungen hinweg beizubehalten, behalten Sie einen separaten Überblick über GameObjects die Verwendung eines bestimmten Weltankers. Sie können einen GameObject Stamm mit einem Weltanker erstellen und untergeordnete Hologramme damit mit einem lokalen Positionsoffset verankern.
So laden Sie Hologramme aus früheren Sitzungen:
Rufen Sie die WorldAnchorStoreab.
Laden Sie die Daten der Weltanker-App, wodurch Sie die ID des Weltankers erhalten.
Laden Sie den Weltanker nach seiner ID.
So speichern Sie Hologramme für zukünftige Sitzungen:
Rufen Sie die WorldAnchorStoreab.
Speichern Sie einen Weltanker, indem Sie eine ID angeben.
Speichern Sie App-Daten im Zusammenhang mit dem Weltanker zusammen mit der ID.
Abrufen des WorldAnchorStore
Behalten Sie einen Verweis auf , WorldAnchorStoredamit Sie wissen, wann sie bereit ist, einen Vorgang auszuführen. Da dieser Aufruf asynchron ist, können Sie beim Starten der App Folgendes aufrufen:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded ist der Handler, wenn der WorldAnchorStore Ladevorgang abgeschlossen ist:
Sie verfügen nun über einen Verweis auf , den WorldAnchorStoreSie verwenden können, um bestimmte Weltanker zu speichern und zu laden.
Speichern eines Weltankers
Um einen Weltanker zu speichern, benennen Sie den Weltanker, und übergeben Sie ihn in dem, den WorldAnchorStore Sie zuvor erhalten haben. Wenn Sie versuchen, zwei Anker in derselben Zeichenfolge zu speichern, store.Save wird false zurückgegeben. Löschen Sie die vorherige Speicherung, bevor Sie einen neuen speichern.
private void SaveGame()
{
// Save data about holograms that this world anchor positions
if (!this.savedRoot) // Only save the root once
{
this.savedRoot = this.store.Save("rootGameObject", anchor);
Assert(this.savedRoot);
}
}
Laden eines Weltankers
So laden Sie einen Weltanker:
private void LoadGame()
{
// Saved data about holograms that this world anchor positions:
this.savedRoot = this.store.Load("rootGameObject", rootGameObject);
if (!this.savedRoot)
{
// Game root not saved. Re-place objects or start over.
}
}
Sie können auch verwenden store.Delete() , um einen zuvor gespeicherten Anker zu entfernen und store.Clear() alle zuvor gespeicherten Daten zu entfernen.
Auflisten vorhandener Anker
Rufen Sie zum Auflisten gespeicherter Anker auf GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Beibehalten von Hologrammen für mehrere Geräte
Sie können Azure Spatial Anchors verwenden, um einen dauerhaften Cloudanker aus einem lokalen Weltanker zu erstellen. Ihre App kann den Cloudanker auf mehreren HoloLens-, iOS- und Android-Geräten finden, auch wenn die Geräte nicht gleichzeitig zusammen sind. Da Cloudanker persistent sind, können mehrere Geräte im Laufe der Zeit Inhalte sehen, die relativ zu diesem Anker an demselben physischen Speicherort gerendert werden.