Freigeben über


Erstellen eines Datenanbieters für räumliches Bewusstseinssystem – MRTK2

Das Spatial Awareness-System ist ein erweiterbares System zur Bereitstellung von Daten zu realen Umgebungen für Anwendungen. 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, auch als Räumliche Beobachter bezeichnet, für das Spatial Awareness-System erstellen. Der hier gezeigte Beispielcode stammt aus der SpatialObjectMeshObserver Klassenimplementierung, die zum Laden von 3D-Gitterdaten im Editor nützlich ist.

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 eine von zwei Arten verteilt werden:

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

Das Genehmigungsverfahren für übermittlungen 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 vom Typ "Featureanforderung" 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 erzeugt
  • Funktionsbereich

Ein Spatial Awareness-Datenanbieter, der vom Unternehmen Contoso erstellt und ausgeliefert wird, 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.

Beispielordnerstruktur

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 enthält mindestens ein vorgefertigtes profilskriptfähiges Objekt.

MRTK-Übermittlung

Namespace

Wenn ein Datenanbieter für das räumliche Bewusstseinssystem 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 Datentyp (z. B. Gitter oder Ebenen) zu bestimmen, der für Anwendungen bereitgestellt wird.

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 Vererbung von Schnittstellen und/oder Basisklassen

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

Anwenden des MixedRealityDataProvider-Attributs

Ein wichtiger Schritt beim Erstellen eines Spatial Awareness-Datenanbieters besteht darin, das MixedRealityDataProvider -Attribut auf die -Klasse anzuwenden. Dieser Schritt ermöglicht das Festlegen des Standardprofils und der Plattform(en) für den Datenanbieter, wenn sie im Spatial Awareness-Profil ausgewählt sind, sowie Name, Ordnerpfad und mehr.

[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

Im nächsten Schritt fügen Sie die Logik des Datenanbieters hinzu, 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 des Geräteverständnisses der Umgebung 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 Gitterdaten 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 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 führt zu einem gewissen Mehraufwand, den Anwendungen berücksichtigen müssen. Zu diesem Zweck ist es wichtig, dass alle Spatial Awareness-Datenanbieter unity Profiler-Instrumentierung in innerer Schleife und häufig verwendete Codepfade enthalten.

Es wird empfohlen, das vom 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 einem ähnlichen Muster folgen, 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 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 soll.

[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 über das> MenüRessourcen>erstellen Mixed Reality Toolkitprofile> ein Profil instance 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

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 gilt 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 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 folgendes:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit. Editor. Inspektoren
  • Microsoft.MixedReality.Toolkit. Editor. Versorgungswirtschaft

Registrieren des Datenanbieters

Nach der Erstellung kann der Datenanbieter beim Spatial Awareness-System registriert werden, um in der Anwendung verwendet zu werden.

Auswählen des Gitterbeobachters für räumliche Objekte

Verpackung und Vertrieb

Datenanbieter, die als Komponenten von Drittanbietern verteilt werden, haben die spezifischen Details der Verpackung und Verteilung den Präferenzen des Entwicklers überlassen. Wahrscheinlich wird die häufigste Lösung sein, ein UNITY-Paket zu generieren und über den Unity Asset Store zu verteilen.

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.

Siehe auch