Erstellen eines Datenanbieters für räumliches Bewusstseinssystem — MRTK2
Das Spatial Awareness-System ist ein erweiterbares System zur Bereitstellung von Anwendungen mit Daten über reale Umgebungen. Um Unterstützung für eine neue Hardwareplattform oder eine neue Form von Spatial Awareness-Daten hinzuzufügen, ist möglicherweise ein benutzerdefinierter Datenanbieter erforderlich.
In diesem Artikel wird beschrieben, wie Sie benutzerdefinierte Datenanbieter erstellen, die auch als Spatial Observers bezeichnet werden, für das Spatial Awareness-System. Der hier gezeigte Beispielcode stammt aus der SpatialObjectMeshObserver
Klassenimplementierung, die zum Laden von 3D-Mesh-Daten im Editor nützlich ist.
Hinweis
Der vollständige Quellcode, der in diesem Beispiel verwendet wird, befindet sich im Assets/MRTK/Providers/ObjectMeshObserver
Ordner.
Namespace- und Ordnerstruktur
Datenanbieter können auf zwei Arten verteilt werden:
- Add-Ons von Drittanbietern
- Teil des Microsoft Mixed Reality Toolkits
Das Genehmigungsverfahren für die Übermittlung neuer Datenanbieter an MRTK variiert von Fall zu Fall und wird zum Zeitpunkt des ursprünglichen Vorschlags mitgeteilt. Vorschläge können übermittelt werden, indem ein neues Problem mit dem Featureanforderungstyp erstellt wird.
Drittanbieter-Add-On
Namespace
Datenanbieter müssen über einen Namespace verfügen, um potenzielle Namenskonflikte zu vermeiden. Es wird empfohlen, dass der Namespace die folgenden Komponenten enthält.
- Firmenname, der das Add-On erstellt
- Featurebereich
Ein Spatial Awareness-Datenanbieter, der vom Unternehmen Contoso erstellt und ausgeliefert wurde, kann beispielsweise "Contoso.MixedReality.Toolkit.SpatialAwareness" sein.
Ordnerstruktur
Es wird empfohlen, den Quellcode für Datenanbieter in einer Ordnerhierarchie zu erstellen, wie in der folgenden Abbildung dargestellt.
Wenn der Ordner ContosoSpatialAwareness die Implementierung des Datenanbieters enthält, enthält der Ordner Editor den Inspektor (und jeden anderen spezifischen Unity-Editor-Code) und der Ordner Profiles ein oder mehrere vordefinierte Profilskriptobjekte.
MRTK-Übermittlung
Namespace
Wenn ein Raumerkennungssystemdatenanbieter an das Mixed Reality Toolkit-Repository übermittelt wird, muss der Namespace mit Microsoft.MixedReality.Toolkit (z. B. Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver) beginnen.
und der Code sollte sich in einem Ordner unter MRTK/Providers (z. B. MRTK/Providers/ObjectMeshObserver) befinden.
Ordnerstruktur
Der gesamte Code sollte sich in einem Ordner unter MRTK/Providers (z. B. MRTK/Providers/ObjectMeshObserver) befinden.
Definieren des räumlichen Datenobjekts
Der erste Schritt beim Erstellen eines Spatial Awareness-Datenanbieters besteht darin, den Typ der Daten (z. B. Gitter oder Ebenen) zu bestimmen, die er anwendungen bereitstellt.
Alle räumlichen Datenobjekte müssen die IMixedRealitySpatialAwarenessObject
Schnittstelle implementieren.
Die Mixed Reality Toolkit-Basis stellt die folgenden räumlichen Objekte bereit, die in neuen Datenanbietern verwendet oder erweitert werden können.
Implementieren des Datenanbieters
Angeben von Schnittstellen- und/oder Basisklassenvererbung
Alle Spatial Awareness-Datenanbieter müssen die IMixedRealitySpatialAwarenessObserver
Schnittstelle implementieren, die die Mindestfunktionalität angibt, die für das Spatial Awareness-System erforderlich ist. Die MRTK-Grundlage enthält die BaseSpatialObserver
-Klasse, die eine Standardimplementierung dieser erforderlichen Funktionalität bereitstellt.
public class SpatialObjectMeshObserver :
BaseSpatialObserver,
IMixedRealitySpatialAwarenessMeshObserver,
IMixedRealityCapabilityCheck
{ }
Hinweis
Die IMixedRealityCapabilityCheck
-Schnittstelle wird von der SpatialObjectMeshObserver
-Klasse verwendet, um anzugeben, dass sie Unterstützung für die SpatialAwarenessMesh-Funktion bietet.
Anwenden des MixedRealityDataProvider-Attributs
Ein wichtiger Schritt beim Erstellen eines Spatial Awareness-Datenanbieters ist das Anwenden des MixedRealityDataProvider
Attributs auf die -Klasse. Dieser Schritt ermöglicht das Festlegen des Standardprofils und der Plattform(en) für den Datenanbieter, wenn sie im Profil "Spatial Awareness" sowie "Name", "Ordnerpfad" und mehr ausgewählt sind.
[MixedRealityDataProvider(
typeof(IMixedRealitySpatialAwarenessSystem),
SupportedPlatforms.WindowsEditor | SupportedPlatforms.MacEditor | SupportedPlatforms.LinuxEditor,
"Spatial Object Mesh Observer",
"ObjectMeshObserver/Profiles/DefaultObjectMeshObserverProfile.asset",
"MixedRealityToolkit.Providers")]
public class SpatialObjectMeshObserver :
BaseSpatialObserver,
IMixedRealitySpatialAwarenessMeshObserver,
IMixedRealityCapabilityCheck
{ }
Implementieren der IMixedRealityDataProvider-Methoden
Nachdem die -Klasse definiert wurde, besteht der nächste Schritt darin, die Implementierung der IMixedRealityDataProvider
Schnittstelle bereitzustellen.
Hinweis
Die BaseSpatialObserver
-Klasse stellt über die BaseService
-Klasse nur leere Implementierungen für IMixedRealityDataProvider
Methoden bereit. Die Details dieser Methoden sind in der Regel datenanbieterspezifisch.
Die Methoden, die vom Datenanbieter implementiert werden sollten, sind:
Destroy()
Disable()
Enable()
Initialize()
Reset()
Update()
Implementieren der Datenanbieterlogik
Der nächste Schritt besteht darin, die Logik des Datenanbieters hinzuzufügen, indem Sie die spezifische Datenanbieterschnittstelle implementieren, z. B IMixedRealitySpatialAwarenessMeshObserver
. . Dieser Teil des Datenanbieters ist in der Regel plattformspezifisch.
Benachrichtigungen zu Beobachtungsänderungen
Damit Anwendungen auf Änderungen im Verständnis der Umgebung des Geräts reagieren können, löst der Datenanbieter Benachrichtigungsereignisse aus, wie in der IMixedRealitySpatialAwarenessObservationtHandler<T>
Schnittstelle definiert.
OnObservationAdded()
OnObservationRemoved()
OnObservationUpdated()
Der folgende Code aus den Beispielen veranschaulicht das SpatialObjectMeshObserver
Auslösen und Ereignis beim Hinzufügen von Mesh-Daten.
// The data to be sent when mesh observation events occur.
// This member variable is initialized as part of the Initialize() method.
private MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> meshEventData = null;
/// <summary>
/// Sends the observations using the mesh data contained within the configured 3D model.
/// </summary>
private void SendMeshObjects()
{
if (!sendObservations) { return; }
if (spatialMeshObject != null)
{
MeshFilter[] meshFilters = spatialMeshObject.GetComponentsInChildren<MeshFilter>();
for (int i = 0; i < meshFilters.Length; i++)
{
SpatialAwarenessMeshObject meshObject = SpatialAwarenessMeshObject.Create(
meshFilters[i].sharedMesh,
MeshPhysicsLayer,
$"Spatial Object Mesh {currentMeshId}",
currentMeshId,
ObservedObjectParent);
meshObject.GameObject.transform.localPosition = meshFilters[i].transform.position;
meshObject.GameObject.transform.localRotation = meshFilters[i].transform.rotation;
ApplyMeshMaterial(meshObject);
meshes.Add(currentMeshId, meshObject);
// Initialize the meshEventData variable with data for the added event.
meshEventData.Initialize(this, currentMeshId, meshObject);
// Raise the event via the spatial awareness system.
SpatialAwarenessSystem?.HandleEvent(meshEventData, OnMeshAdded);
currentMeshId++;
}
}
sendObservations = false;
}
Hinweis
Die SpatialObjectMeshObserver
-Klasse löst keine Ereignisse aus OnObservationUpdated
, da das 3D-Modell nur einmal geladen wird. Die Implementierung in der WindowsMixedRealitySpatialMeshObserver
-Klasse bietet ein Beispiel für das Auslösen eines Ereignisses OnObservationUpdated
für ein beobachtetes Gitter.
Hinzufügen der Unity Profiler-Instrumentierung
Die Leistung ist in Mixed Reality-Anwendungen von entscheidender Bedeutung. Jede Komponente verursacht einen gewissen Mehraufwand, für den Anwendungen verantwortlich sind. Zu diesem Zweck ist es wichtig, dass alle Spatial Awareness-Datenanbieter Unity Profiler-Instrumentierung in der inneren Schleife und häufig verwendete Codepfade enthalten.
Es wird empfohlen, das von MRTK verwendete Muster bei der Instrumentierung benutzerdefinierter Anbieter zu implementieren.
private static readonly ProfilerMarker UpdateObserverPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealitySpatialMeshObserver.UpdateObserver");
/// <summary>
/// Requests updates from the surface observer.
/// </summary>
private void UpdateObserver()
{
using (UpdateObserverPerfMarker.Auto())
{
// Code to be measured.
}
}
Hinweis
Der Name, der zum Identifizieren des Profilermarkers verwendet wird, ist willkürlich. MRTK verwendet das folgende Muster.
"[product] className.methodName – optionaler Hinweis"
Es wird empfohlen, dass benutzerdefinierte Datenanbieter ein ähnliches Muster verfolgen, um die Identifizierung bestimmter Komponenten und Methoden beim Analysieren von Ablaufverfolgungen zu vereinfachen.
Erstellen des Profils und des Inspektors
In Mixed Reality Toolkit werden Datenanbieter mithilfe von Profilen konfiguriert.
Definieren des Profils
Profilinhalte sollten die verfügbaren Eigenschaften des Datenanbieters Spiegel (z. B. Updateintervall). Alle benutzerdefinierbaren Eigenschaften, die in jeder Schnittstelle definiert sind, sollten im Profil enthalten sein.
Basisklassen werden empfohlen, wenn ein neuer Datenanbieter einen vorhandenen Anbieter erweitert. Beispielsweise erweitert die SpatialObjectMeshObserverProfile
MixedRealitySpatialAwarenessMeshObserverProfile
, damit Kunden ein 3D-Modell bereitstellen können, das als Umgebungsdaten verwendet werden kann.
[CreateAssetMenu(
menuName = "Mixed Reality Toolkit/Profiles/Spatial Object Mesh Observer Profile",
fileName = "SpatialObjectMeshObserverProfile",
order = 100)]
public class SpatialObjectMeshObserverProfile : MixedRealitySpatialAwarenessMeshObserverProfile
{
[SerializeField]
[Tooltip("The model containing the desired mesh data.")]
private GameObject spatialMeshObject = null;
/// <summary>
/// The model containing the desired mesh data.
/// </summary>
public GameObject SpatialMeshObject => spatialMeshObject;
}
Das CreateAssetMenu
Attribut kann auf die Profilklasse angewendet werden, damit Kunden ein Profil instance erstellen können, indem Sie das MenüRessourcen>erstellen>Mixed Reality Toolkitprofile>verwenden.
Implementieren des Inspektors
Profilinspektoren sind die Benutzeroberfläche zum Konfigurieren und Anzeigen von Profilinhalten. Jeder Profilinspektor sollte die BaseMixedRealityToolkitConfigurationProfileInspector
-Klasse erweitern.
Das CustomEditor
Attribut informiert Unity über den Typ des Medienobjekts, für das der Inspektor gilt.
[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }
Erstellen von Assemblydefinitionen
Mixed Reality Toolkit verwendet Assemblydefinitionsdateien (.asmdef), um Abhängigkeiten zwischen Komponenten anzugeben und Unity bei der Reduzierung der Kompilierungszeit zu unterstützen.
Es wird empfohlen, Assemblydefinitionsdateien für alle Datenanbieter und deren Editorkomponenten zu erstellen.
Bei Verwendung der Ordnerstruktur im vorherigen Beispiel wären zwei ASMDEF-Dateien für den Datenanbieter ContosoSpatialAwareness vorhanden.
Die erste Assemblydefinition ist für den Datenanbieter. In diesem Beispiel heißt es ContosoSpatialAwareness und befindet sich im Ordner ContosoSpatialAwareness des Beispiels. Diese Assemblydefinition muss eine Abhängigkeit von Microsoft.MixedReality.Toolkit und allen anderen Assemblys angeben, von denen sie abhängt.
Die ContosoInputEditor-Assemblydefinition gibt den Profilinspektor und den editorspezifischen Code an. Diese Datei muss sich im Stammordner des Editorcodes befinden. In diesem Beispiel befindet sich die Datei im Ordner ContosoSpatialAwareness\Editor . Diese Assemblydefinition enthält einen Verweis auf die ContosoSpatialAwareness-Assembly sowie folgendes:
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Editor.Inspectors
- Microsoft.MixedReality.Toolkit.Editor.Utilities
Registrieren des Datenanbieters
Nach der Erstellung kann der Datenanbieter beim Spatial Awareness-System registriert werden, das in der Anwendung verwendet werden soll.
Verpackung und Vertrieb
Datenanbieter, die als Komponenten von Drittanbietern verteilt werden, haben die spezifischen Details der Verpackung und Verteilung dem Wunsch des Entwicklers überlassen. Wahrscheinlich ist die gängigste Lösung das Generieren eines UNITY-Pakets und die Verteilung über den Unity Asset Store.
Wenn ein Datenanbieter als Teil des Microsoft Mixed Reality Toolkit-Pakets übermittelt und akzeptiert wird, packt und verteilt das Microsoft MRTK-Team ihn als Teil der MRTK-Angebote.
Weitere Informationen
- System für die räumliche Wahrnehmung
IMixedRealitySpatialAwarenessObject
SchnittstelleBaseSpatialAwarenessObject
-KlasseSpatialAwarenessMeshObject
-KlasseSpatialAwarenessPlanarObject
-KlasseIMixedRealitySpatialAwarenessObserver
SchnittstelleBaseSpatialObserver
-KlasseIMixedRealitySpatialAwarenessMeshObserver
SchnittstelleIMixedRealityDataProvider
SchnittstelleIMixedRealityCapabilityCheck
Schnittstelle