Creazione di un provider di dati del sistema di consapevolezza spaziale - MRTK2

Il sistema Spatial Awareness è un sistema estendibile per fornire alle applicazioni dati sugli ambienti reali. Per aggiungere il supporto per una nuova piattaforma hardware o una nuova forma di dati di consapevolezza spaziale, potrebbe essere necessario un provider di dati personalizzato.

Questo articolo descrive come creare provider di dati personalizzati, detti anche osservatori spaziali, per il sistema di consapevolezza spaziale. Il codice di esempio illustrato di seguito è tratto dall'implementazione della SpatialObjectMeshObserver classe che è utile per il caricamento di dati mesh 3D nell'editor.

Nota

Il codice sorgente completo usato in questo esempio è disponibile nella Assets/MRTK/Providers/ObjectMeshObserver cartella .

Struttura di spazi dei nomi e cartelle

I provider di dati possono essere distribuiti in uno dei due modi seguenti:

  1. Componenti aggiuntivi di terze parti
  2. Parte di Microsoft Realtà mista Toolkit

Il processo di approvazione per l'invio di nuovi provider di dati a MRTK varierà caso per caso e verrà comunicato al momento della proposta iniziale. Le proposte possono essere inviate creando un nuovo problema di tipo richiesta di funzionalità.

Componente aggiuntivo di terze parti

Spazio dei nomi

I provider di dati devono avere uno spazio dei nomi per attenuare potenziali conflitti di nomi. È consigliabile che lo spazio dei nomi includa i componenti seguenti.

  • Nome della società che produce il componente aggiuntivo
  • Area funzionale

Ad esempio, un provider di dati Spatial Awareness creato e spedito dalla società Contoso può essere "Contoso.MixedReality.Toolkit.SpatialAwareness".

Struttura di cartelle

È consigliabile disporre il codice sorgente per i provider di dati in una gerarchia di cartelle, come illustrato nell'immagine seguente.

Esempio di struttura di cartelle

In cui la cartella ContosoSpatialAwareness contiene l'implementazione del provider di dati, la cartella Editor contiene il controllo (e qualsiasi altro codice specifico dell'editor Unity) e la cartella Profiles contiene uno o più oggetti profilati preconfigurati.

Invio di MRTK

Spazio dei nomi

Se un provider di dati del sistema di consapevolezza spaziale viene inviato al repository di Realtà mista Toolkit, lo spazio dei nomi deve iniziare con Microsoft.MixedReality.Toolkit (ad esempio: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)

e il codice deve trovarsi in una cartella sotto MRTK/Providers (ad esempio MRTK/Providers/ObjectMeshObserver).

Struttura di cartelle

Tutto il codice deve trovarsi in una cartella sotto MRTK/Providers (ad esempio MRTK/Providers/ObjectMeshObserver).

Definire l'oggetto dati spaziali

Il primo passaggio per la creazione di un provider di dati Di consapevolezza spaziale consiste nel determinare il tipo di dati (ad esempio mesh o piani) che fornirà alle applicazioni.

Tutti gli oggetti dati spaziali devono implementare l'interfaccia IMixedRealitySpatialAwarenessObject .

La base di Realtà mista Toolkit fornisce gli oggetti spaziali seguenti che possono essere usati o estesi nei nuovi provider di dati.

Implementare il provider di dati

Specificare l'ereditarietà dell'interfaccia e/o della classe di base

Tutti i provider di dati Spatial Awareness devono implementare l'interfaccia IMixedRealitySpatialAwarenessObserver , che specifica la funzionalità minima richiesta dal sistema di consapevolezza spaziale. La base MRTK include la BaseSpatialObserver classe che fornisce un'implementazione predefinita di questa funzionalità necessaria.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Nota

L'interfaccia IMixedRealityCapabilityCheckSpatialObjectMeshObserver viene usata dalla classe per indicare che fornisce supporto per la funzionalità SpatialAwarenessMesh.

Applicare l'attributo MixedRealityDataProvider

Un passaggio chiave per la creazione di un provider di dati Di consapevolezza spaziale consiste nell'applicare l'attributo MixedRealityDataProvider alla classe . Questo passaggio abilita l'impostazione del profilo predefinito e delle piattaforme per il provider di dati, se selezionata nel profilo Di consapevolezza spaziale, oltre a Nome, percorso cartella e altro ancora.

[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
{ }

Implementare i metodi IMixedRealityDataProvider

Dopo aver definito la classe, il passaggio successivo consiste nel fornire l'implementazione dell'interfaccia IMixedRealityDataProvider .

Nota

La BaseSpatialObserver classe , tramite la BaseService classe , fornisce solo implementazioni vuote per IMixedRealityDataProvider i metodi. I dettagli di questi metodi sono in genere specifici del provider di dati.

I metodi che devono essere implementati dal provider di dati sono:

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

Implementare la logica del provider di dati

Il passaggio successivo consiste nell'aggiungere la logica del provider di dati implementando l'interfaccia del provider di dati specifica, ad esempio IMixedRealitySpatialAwarenessMeshObserver. Questa parte del provider di dati in genere sarà specifica della piattaforma.

Notifiche di modifica delle osservazioni

Per consentire alle applicazioni di rispondere alle modifiche nella comprensione dell'ambiente del dispositivo, il provider di dati genera eventi di notifica come definito nell'interfaccia IMixedRealitySpatialAwarenessObservationtHandler<T> .

  • OnObservationAdded()
  • OnObservationRemoved()
  • OnObservationUpdated()

Il codice seguente degli esempi illustra la generazione e l'evento SpatialObjectMeshObserver quando vengono aggiunti dati mesh.

// 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;
}

Nota

La SpatialObjectMeshObserver classe non genera OnObservationUpdated eventi perché il modello 3D viene caricato una sola volta. L'implementazione nella WindowsMixedRealitySpatialMeshObserver classe fornisce un esempio di generazione di un OnObservationUpdated evento per una mesh osservata.

Aggiungere la strumentazione del profiler unity

Le prestazioni sono fondamentali nelle applicazioni di realtà mista. Ogni componente comporta un sovraccarico per cui le applicazioni devono tenere conto. A questo scopo, è importante che tutti i provider di dati di consapevolezza spaziale contengano la strumentazione del profiler Unity nel ciclo interno e i percorsi di codice usati di frequente.

È consigliabile implementare il modello utilizzato da MRTK durante la strumentazione di provider personalizzati.

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

Nota

Il nome usato per identificare il marcatore del profiler è arbitrario. MRTK usa il modello seguente.

"[product] className.methodName - nota facoltativa"

È consigliabile che i provider di dati personalizzati seguano un modello simile per semplificare l'identificazione di componenti e metodi specifici durante l'analisi delle tracce.

Creare il profilo e il controllo

In Realtà mista Toolkit i provider di dati vengono configurati usando i profili.

Definire il profilo

Il contenuto del profilo deve eseguire il mirroring delle proprietà accessibili del provider di dati (ad esempio, intervallo di aggiornamento). Tutte le proprietà configurabili dall'utente definite in ogni interfaccia devono essere contenute con il profilo.

Le classi di base sono incoraggiate se un nuovo provider di dati estende un provider esistente. Ad esempio, SpatialObjectMeshObserverProfile estende per MixedRealitySpatialAwarenessMeshObserverProfile consentire ai clienti di fornire un modello 3D da usare come dati dell'ambiente.

[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;
}

L'attributo CreateAssetMenu può essere applicato alla classe del profilo per consentire ai clienti di creare un'istanza del profilo usando il menu Crea>asset>Realtà mista Toolkit>Profiles.

Implementare il controllo

I controlli profilo sono l'interfaccia utente per la configurazione e la visualizzazione del contenuto del profilo. Ogni controllo profilo deve estendere la BaseMixedRealityToolkitConfigurationProfileInspector classe .

L'attributo CustomEditor indica a Unity il tipo di asset a cui si applica il controllo.

[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

Creare definizioni di assembly

Realtà mista Toolkit usa file di definizione dell'assembly (con estensione asmdef) per specificare le dipendenze tra i componenti e per facilitare Unity nella riduzione del tempo di compilazione.

È consigliabile creare file di definizione dell'assembly per tutti i provider di dati e i relativi componenti dell'editor.

Usando la struttura di cartelle nell'esempio precedente, sono presenti due file con estensione asmdef per il provider di dati ContosoSpatialAwareness.

La prima definizione dell'assembly è per il provider di dati. Per questo esempio, verrà chiamato ContosoSpatialAwareness e si troverà nella cartella ContosoSpatialAwareness dell'esempio. Questa definizione di assembly deve specificare una dipendenza da Microsoft.MixedReality.Toolkit e da qualsiasi altro assembly da cui dipende.

La definizione dell'assembly ContosoInputEditor specifica il controllo del profilo e qualsiasi codice specifico dell'editor. Questo file deve trovarsi nella cartella radice del codice dell'editor. In questo esempio il file si troverà nella cartella ContosoSpatialAwareness\Editor . Questa definizione di assembly conterrà un riferimento all'assembly ContosoSpatialAwareness e:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspectors
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

Registrare il provider di dati

Dopo la creazione, il provider di dati può essere registrato con il sistema di consapevolezza spaziale da usare nell'applicazione.

Selezione dell'osservatore della mesh di oggetti spaziali

Creazione di pacchetti e distribuzione

I provider di dati distribuiti come componenti di terze parti hanno i dettagli specifici della creazione di pacchetti e della distribuzione lasciati alla preferenza dello sviluppatore. Probabilmente, la soluzione più comune sarà generare un pacchetto unity e distribuire tramite Unity Asset Store.

Se un provider di dati viene inviato e accettato come parte del pacchetto Microsoft Realtà mista Toolkit, il team microsoft MRTK lo conterrà e lo distribuirà come parte delle offerte MRTK.

Vedi anche