Erstellen eines Systemdatenanbieters für räumliche Wahrnehmung

Das Spatial Awareness-System ist ein erweiterbares System, mit dem Anwendungen Daten zu realen Umgebungen bereitstellen können. Um Unterstützung für eine neue Hardwareplattform oder eine neue Form von Räumlichen Wahrnehmungsdaten hinzuzufügen, ist möglicherweise ein benutzerdefinierter Datenanbieter erforderlich.

In diesem Artikel wird beschrieben, wie Sie benutzerdefinierte Datenanbieter, auch als Räumliche Beobachter bezeichnet, für das System für räumliche Wahrnehmung erstellen. Der hier gezeigte Beispielcode stammt aus der SpatialObjectMeshObserver Klassenimplementierungen, die zum Laden von SpatialObjectMeshObserverist.

Hinweis

Den vollständigen Quellcode, der in diesem Beispiel verwendet wird, finden Sie im Assets/MRTK/Providers/ObjectMeshObserver Ordner .

Namespace- und Ordnerstruktur

Datenanbieter können auf zwei Arten verteilt werden:

  1. Add-Ons von Drittanbietern
  2. Teil des Microsoft Mixed Reality Toolkit

Der Genehmigungsprozess für die Übermittlung neuer Datenanbieter an das MRTK variiert von Fall zu Fall und wird zum Zeitpunkt des ursprünglichen Vorschlags kommuniziert. Vorschläge können übermittelt werden, indem ein neues Problem vom Typ Featureanforderungerstellt wird.

Drittanbieter-Add-On

Namespace

Datenanbieter müssen über einen Namespace verfügen, um potenzielle Namenskonflikte zu minimieren. Es wird empfohlen, dass der Namespace die folgenden Komponenten enthält.

  • Firmenname, der das Add-On erzeugt
  • Featurebereich

Ein Vom Contoso-Unternehmen erstellter und ausgelieferter Spatial Awareness-Datenanbieter 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.

Beispiel für die Paketordnerstruktur

Wenn der Ordner ContosoSpatialAwareness die Implementierung des Datenanbieters enthält, enthält der Ordner Editor den Inspektor (und jeden anderen codespezifischen Code des Unity-Editors), und der Ordner Profile enthält ein oder mehrere vorgefertigte Profile, die skriptfähig sind.

MRTK-Übermittlung

Namespace

Wenn ein Systemdatenanbieter für räumliche Wahrnehmung 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 Datenanbieters für räumliche Wahrnehmung ist die Bestimmung des Datentyps (z. B. Gitternetze oder Ebenen), die für Anwendungen zur Verfügung stehen.

Alle räumlichen Datenobjekte müssen die IMixedRealitySpatialAwarenessObject -Schnittstelle implementieren.

Die Mixed Reality Toolkit-Grundlage stellt die folgenden räumlichen Objekte bereit, die in neuen Datenanbietern verwendet oder erweitert werden können.

Implementieren des Datenanbieters

Angeben der Schnittstellen- und/oder Basisklassenvererbung

Alle Spatial Awareness-Datenanbieter müssen die IMixedRealitySpatialAwarenessObserver -Schnittstelle implementieren, die die mindest erforderliche Funktionalität für das Spatial Awareness-System angibt. 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 bereitstellt.

Anwenden des MixedRealityDataProvider-Attributs

Ein wichtiger Schritt beim Erstellen eines Datenanbieters für räumliche Wahrnehmung ist das Anwenden des MixedRealityDataProvider -Attributs auf die -Klasse. Mit diesem Schritt können Sie das Standardprofil und die Standardplattformen für den Datenanbieter festlegen, wenn sie im Profil für räumliche Wahrnehmung sowie Name, Ordnerpfad usw. 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 im Allgemeinen datenanbieterspezifisch.

Folgende Methoden sollten vom Datenanbieter implementiert werden:

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

Implementieren der Datenanbieterlogik

Der nächste Schritt besteht darin, die Logik des Datenanbieters hinzuzufügen, indem die spezifische Datenanbieterschnittstelle implementiert wird, z. IMixedRealitySpatialAwarenessMeshObserver B. . 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, wenn Meshdaten hinzugefügt werden.

// 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 gibt keine OnObservationUpdated Ereignisse aus, da das 3D-Modell nur einmal geladen wird. Die Implementierung in der -Klasse stellt ein Beispiel für das WindowsMixedRealitySpatialMeshObserver Auslösen eines OnObservationUpdated Ereignisses für ein beobachtetes Gitternetz bereit.

Hinzufügen der Unity Profiler-Instrumentierung

Leistung ist in Mixed Reality-Anwendungen von entscheidender Bedeutung. Jede Komponente erhöht den Mehraufwand, den Anwendungen berücksichtigen müssen. Zu diesem Zweck ist es wichtig, dass alle Anbieter räumlicher Wahrnehmungsdaten die Unity Profiler-Instrumentierung in inneren Schleifen und häufig verwendeten Codepfaden enthalten.

Es wird empfohlen, das Muster zu implementieren, das vom MRTK beim Instrumentieren benutzerdefinierter Anbieter verwendet wird.

        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. Das MRTK verwendet das folgende Muster.

"[product] className.methodName – optionaler Hinweis"

Es wird empfohlen, dass benutzerdefinierte Datenanbieter ein ähnliches Muster befolgen, um die Identifizierung bestimmter Komponenten und Methoden bei der Analyse von Ablaufverfolgungen zu vereinfachen.

Erstellen des Profils und des Inspektors

Im Mixed Reality Toolkit werden Datenanbieter mithilfe von Profilenkonfiguriert.

Definieren des Profils

Profilinhalte sollten die zugänglichen Eigenschaften des Datenanbieters spiegeln (z. B. Updateintervall). Alle vom Benutzer konfigurierbaren 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 , SpatialObjectMeshObserverProfileMixedRealitySpatialAwarenessMeshObserverProfile 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, CreateAssetMenudamit Kunden mithilfe des > Menüs>>>erstellen eine Profilinstanz erstellen >> können.

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

Das Mixed Reality Toolkit verwendet Assemblydefinitionsdateien(ASMDEF-Dateien),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.

Wenn Sie die Ordnerstruktur im vorherigen Beispiel verwenden, gibt es zwei ASMDEF-Dateien für den ContosoSpatialAwareness-Datenanbieter.

Die erste Assemblydefinition gilt für den Datenanbieter. In diesem Beispiel heißt sie 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 jeden 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:

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

Auswählen des Raumobjektgittermodell-Beobachters

Verpacken und Verteilen

Datenanbieter, die als Komponenten von Drittanbietern verteilt werden, haben die spezifischen Details der Paketierung und Verteilung nach Wunsch des Entwicklers. Die wahrscheinlichste Lösung besteht in der Generierung eines UNITYPACKAGE und der Verteilung über das Unity-Store.

Wenn ein Datenanbieter als Teil des Microsoft Mixed Reality Toolkit-Pakets übermittelt und akzeptiert wird, packt und verteilt das Microsoft MRTK-Team es im Rahmen der MRTK-Angebote.

Siehe auch