Wenn Sie Ihre Hologramme an Ort und Stelle halten, sich mit Ihnen bewegen oder sich in einigen Fällen relativ zu anderen Hologrammen positionieren, ist ein großer Teil der Erstellung von Mixed Reality-Anwendungen. Dieser Artikel führt Sie durch unsere empfohlene Lösung mithilfe von World Locking Tools, aber wir behandeln auch das manuelle Einrichten von räumlichen Verankerungen in Ihren Unity-Projekten. Bevor wir in einen Code springen, ist es wichtig zu verstehen, wie Unity den Koordinatenbereich und verankert in seinem eigenen Modul behandelt.
Koordinatensysteme im Weltmaßstab
Beim Schreiben von Spielen, Datenvisualisierungs-Apps oder Virtual Reality-Apps besteht der typische Ansatz darin, ein absolutes Weltkoordinatensystem einzurichten, dem alle anderen Koordinaten zuverlässig zugeordnet werden können. In dieser Umgebung können Sie immer eine stabile Transformation finden, die eine Beziehung zwischen zwei objekten in dieser Welt definiert. Wenn Sie diese Objekte nicht verschoben haben, bleiben ihre relativen Transformationen immer gleich. Diese Art von globalem Koordinatensystem ist einfach zu finden, wenn Sie eine rein virtuelle Welt rendern, in der Sie alle Geometrie im Voraus kennen. Vr-Apps im Raummaßstab etablieren heute in der Regel diese Art von absolutem Raumkoordinatensystem 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 und passt seine Kenntnisse im Laufe der Zeit der Umgebung des Benutzers kontinuierlich an, während sie über eine ganze Etage eines Gebäudes gehen. Wenn Sie all Ihre Hologramme in einem naiven starren Koordinatensystem platziert haben, würden diese Hologramme in einem weltgerechten Koordinatensystem im Laufe der Zeit verdriften, entweder basierend auf der Welt oder relativ zueinander.
Beispielsweise kann das Headset derzeit glauben, dass zwei Standorte in der Welt 4 Meter auseinander liegen, und dann später verfeinern Sie dieses Verständnis, und lernen Sie, dass die Standorte tatsächlich 3,9 Meter auseinander liegen. Wenn diese Hologramme anfangs 4 Meter auseinander in einem einzigen starren Koordinatensystem platziert wurden, würde einer davon immer 0,1 Meter von der realen Welt entfernt erscheinen.
Sie können räumliche Verankerungen 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 Relation zueinander und bewegen sich auch durch den globalen Koordinatenraum. In diesem Szenario werden einfache Aufgaben wie das Layout schwierig. Physiksimulation kann auch problematisch sein.
World Locking Tools (WLT) bringt Ihnen das Beste aus beiden Welten, indem Sie ein einzelnes starres Koordinatensystem mithilfe einer internen Versorgung mit räumlichen Verankerungen in der virtuellen Szene stabilisieren, während sich der Benutzer bewegt. WLT analysiert die Koordinaten der Kamera und diese räumlichen Verankerungen jedes Frames. Anstatt die Koordinaten aller Elemente der Welt zu ändern, um die Korrekturen in den Koordinaten des Kopfes des Benutzers auszugleichen, korrigiert WLT stattdessen die Koordinaten des Kopfes.
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 räumlicher Verankerungen. Sie müssen nicht mit ARAnchorManager oder WorldAnchor interagieren, um Ihre Hologramme weltgesperrt 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 das Mixed Reality-Featuretool herunter, um mit der Verwendung der World Locking Tools zu beginnen. Weitere Informationen zu den Grundlagen finden Sie auf der Hauptdokumentationsseite der World Locking Tools für Links zu Übersicht, Schnellstart und anderen nützlichen Themen.
Wenn Ihr Projekt einsatzbereit ist, führen Sie das Dienstprogramm "Szenen konfigurieren" aus den 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 Visualisierungen hilfreich sein, um sicherzustellen, dass WLT eingerichtet und ordnungsgemäß 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 liefert grundlegende Ankerfunktionen durch eine Implementierung des ARFoundation ARAnchorManager von Unity. Um die Grundlagen zu ARAnchors in ARFoundation zu lernen, besuchen Sie das ARFoundation Manual für AR Anchor Manager.
In älteren Unity-Versionen erstellen Sie einen räumlichen Anker, 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 seiner aktuellen Position in der physischen Welt verankert. Möglicherweise werden die Unity-Weltkoordinaten im Laufe der Zeit leicht angepasst, um die physische Ausrichtung sicherzustellen. Sehen Sie sich das Laden eines Weltankers an, um diesen verankerten Ort in einer zukünftigen App-Sitzung erneut zu finden.
Entfernen eines Weltankers
Wenn Sie den GameObject gesperrten Standort nicht mehr an einem physischen Standort wünschen und nicht beabsichtigen, diesen Frame zu verschieben, 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 ist möglicherweise nicht in der physischen Welt zu einem Zeitpunkt ablösbar. Unity aktualisiert dann die Transformation des verankerten Objekts nicht. Diese Situation kann auch auftreten, während eine App ausgeführt wird. Wenn die Änderung der Locatability nicht behandelt wird, wird das Objekt nicht an der richtigen physischen Position in der Welt angezeigt.
So werden Sie über Locatability Changes benachrichtigt:
Abonnieren Sie das OnTrackingChanged Ereignis. Das OnTrackingChanged Ereignis wird aufgerufen, wenn sich der zugrunde liegende räumliche Anker zwischen einem Zustand ändert, der ablösbar ist oder nicht abgeschnitten werden kann.
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 sich Verankerungen sofort befinden, wird die isLocated Eigenschaft des Ankers bei Rückgabe auf true a0> festgelegt. Daher wird das OnTrackingChanged Ereignis nicht ausgelöst. Ein übersichtlicheres Muster besteht darin, den OnTrackingChanged Handler nach dem Anfügen eines Ankers mit dem Anfangszustand IsLocated aufzurufen.
Räumliche Anker sparen Hologramme im realen Raum zwischen Anwendungssitzungen. Nach dem Speichern im HoloLens-Ankerspeicher können räumliche Anker in verschiedenen Sitzungen gefunden und geladen werden und sind ein idealer Fallback, wenn keine Internetverbindung vorhanden ist.
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 im selben Projekt ohne Konflikte haben. 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 auf Geräten wieder her, die die Persistenz lokaler räumlicher Anker unterstützen. Damit ein Hologramm an derselben Stelle in der physischen Welt angezeigt wird, nachdem die Anwendung beendet und erneut ausgeführt wurde, muss die Anwendung nur die gleiche Pose auf dem Hologramm wiederherstellen.
Wenn die Anwendung eine genauere Kontrolle benötigt, können Sie das automatische Speichern und das automatische Laden im Inspektor deaktivieren und die Persistenz von einem Skript aus verwalten. Weitere Informationen finden Sie unter Persist spatial coordinate systems.
World Locking Tools unterstützt lokale Verankerungspersistenz nur auf HoloLens-Geräten. Für Android-, iOS- und HoloLens-Geräte ist die Integration in Azure Spatial Anchors erforderlich, um Persistenz und freigabe von Koordinatenplätzen über Sitzungen und Geräte hinweg zu unterstützen. Weitere Informationen und Beispiele mit World Locking Tools mit Azure Spatial Anchors finden Sie unter World Locking Tools (WLT) in Kombination mit Azure Spatial Anchors (ASA).
Eine API, die XRAnchorStore als "Anker" bezeichnet wird, kann zwischen Sitzungen beibehalten werden. Dies XRAnchorStore ist 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 laden oder Anker aus dem Speicher löschen.
Hinweis
Sie speichern und laden diese Anker auf demselben Gerät. Geräteübergreifende Verankerungen 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 eines Ankerspeicherverweises
Um den XRAnchorStore mit Unity 2020 und OpenXR zu laden, verwenden Sie die Erweiterungsmethode für das XRAnchorSubsystem, das Subsystem eines ARAnchorManagers:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Verwenden Sie zum Laden des XRAnchorStore mit Unity 2019/2020 und dem Windows XR-Plug-In die Erweiterungsmethode für das XRReferencePointSubsystem (Unity 2019) oder XRAnchorSubsystem (Unity 2020), das 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 wie folgt von einem ARAnchorManager-Subsystem darauf zu:
Ein vollständiges Beispiel für persistierende /unpersistente Anker finden Sie unter "Anchors> Sample GameObject" und AnchorsSample.cs Skript in der [Mixed Reality OpenXR-Plug-In-Beispielszene](https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples):
Verwenden Sie Für die Persistenz von Hologrammen in älteren Unity-Versionen oder WSA-Projekten WorldAnchor.
Der WorldAnchorStore erstellt holografische Erfahrungen, bei denen Hologramme in bestimmten realen Positionen in verschiedenen Instanzen der Anwendung bleiben. Benutzer können einzelne Hologramme an beliebiger Stelle anheften und sie später an derselben Stelle über App-Sitzungen finden.
Auf WorldAnchorStore diese Weise können Sie die Position von Weltankern über Sitzungen hinweg beibehalten. Um Hologramme über Sitzungen hinweg beizubehalten, behalten Sie einen separaten Überblick GameObjects darüber, dass ein bestimmter Weltanker verwendet wird. Sie können eine GameObject Wurzel mit einem Weltanker erstellen und untergeordnete Hologramme darin mit einem lokalen Positionsversatz verankern.
So laden Sie Hologramme aus vorherigen Sitzungen:
Rufen Sie die WorldAnchorStore.
Laden Sie World Anchor-App-Daten, die Ihnen die ID des Weltankers geben.
Laden Sie den Weltanker anhand seiner ID.
So speichern Sie Hologramme für zukünftige Sitzungen:
Rufen Sie die WorldAnchorStore.
Speichern Sie einen Weltanker, und geben Sie eine ID an.
Speichern Sie App-Daten im Zusammenhang mit dem Weltanker zusammen mit der ID.
Abrufen des WorldAnchorStore
Bewahren Sie einen Verweis auf die WorldAnchorStoreDatei auf, damit Sie wissen, wann sie zum Ausführen eines Vorgangs bereit ist. Da dieser Aufruf asynchron ist, können Sie, sobald die App gestartet wird, Folgendes aufrufen:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded ist der Handler, wenn das WorldAnchorStore Laden abgeschlossen ist:
Sie haben jetzt einen Verweis auf den WorldAnchorStore, den Sie zum Speichern und Laden bestimmter Weltanker verwenden können.
Speichern eines Weltankers
Um einen Weltanker zu retten, benennen Sie den Weltanker, und übergeben Sie ihn in den WorldAnchorStore von Ihnen erhaltenen. Wenn Sie versuchen, zwei Anker in derselben Zeichenfolge zu speichern, store.Save wird "false" zurückgegeben. Löschen Sie den vorherigen Speicher vor dem Speichern eines neuen Speichers.
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 store.Delete() einen zuvor gespeicherten Anker entfernen und store.Clear() alle zuvor gespeicherten Daten entfernen.
Aufzählen 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 Inhalte sehen, die relativ zu diesem Anker im selben physischen Ort im Laufe der Zeit gerendert werden.
Nächste Schritte
Teilen Sie einen weltgesperrten Koordinatenbereich: