Creazione di un provider di dati del sistema di riconoscimento spaziale

Il sistema Di consapevolezza spaziale è 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 riconoscimento spaziale, potrebbe essere necessario un provider di dati personalizzato.

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

Nota

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

Spazio dei nomi e struttura di cartelle

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

  1. Componenti aggiuntivi di terze parti
  2. Parte di Microsoft Mixed Reality Toolkit

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

Componente aggiuntivo di terze parti

Namespace

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

  • Nome dell'azienda 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 che il codice sorgente per i provider di dati sia disponibile in una gerarchia di cartelle, come illustrato nell'immagine seguente.

Esempio di struttura di cartelle

Dove 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 pre-creati per lo script del profilo.

Invio di MRTK

Namespace

Se un provider di dati del sistema di riconoscimento spaziale viene inviato al repository Mixed Reality 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 spatial awareness consiste nel determinare il tipo di dati (ad esempio mesh o piani) che fornirà alle applicazioni.

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

La base di Mixed Reality 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 di consapevolezza spaziale devono implementare l'interfaccia , che IMixedRealitySpatialAwarenessObserver 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à richiesta.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Nota

IMixedRealityCapabilityCheckL'interfaccia viene usata dalla classe per indicare che fornisce il supporto per la funzionalità SpatialObjectMeshObserver SpatialAwarenessMesh.

Applicare l'attributo MixedRealityDataProvider

Un passaggio chiave per la creazione di un provider di dati Spatial Awareness consiste nell'applicare MixedRealityDataProvider l'attributo alla classe . Questo passaggio abilita l'impostazione del profilo e delle piattaforme predefiniti per il provider di dati, se selezionato nel profilo di consapevolezza spaziale, nonché nome, percorso della 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 IMixedRealityDataProvider dell'interfaccia .

Nota

La BaseSpatialObserver classe , tramite la classe , fornisce solo BaseService implementazioni vuote per i metodi IMixedRealityDataProvider . 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 sarà in genere specifica della piattaforma.

Notifiche di modifica dell'osservazione

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

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

Il codice seguente degli esempi illustra SpatialObjectMeshObserver la generazione e l'evento 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 eventi perché il modello OnObservationUpdated 3D viene caricato una sola volta. L'implementazione WindowsMixedRealitySpatialMeshObserver nella classe fornisce un esempio di generazione di un evento per una mesh OnObservationUpdated osservata.

Aggiungere la strumentazione del profiler Unity

Le prestazioni sono fondamentali nelle applicazioni di realtà mista. Ogni componente aggiunge una certa quantità di overhead di cui le applicazioni devono essere 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 Mixed Reality Toolkit i provider di dati vengono configurati usando i profili.

Definire il profilo

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

Le classi di base sono incoraggiate se un nuovo provider di dati estende un provider esistente. Ad esempio, estende per consentire ai clienti di fornire SpatialObjectMeshObserverProfile MixedRealitySpatialAwarenessMeshObserverProfile 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 può essere applicato alla classe del profilo per consentire ai clienti di creare un'istanza del profilo usando il menu Crea profili di CreateAssetMenu > Assets > Mixed Reality Toolkit. >

Implementare il controllo

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

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

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

Creare definizioni di assembly

Mixed Reality Toolkit usa i file di definizione dell'assembly (asmdef) per specificare le dipendenze tra i componenti e per aiutare Unity a ridurre il 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, saranno presenti due file asmdef per il provider di dati ContosoSpatialAwareness.

La prima definizione di assembly è per il provider di dati. Per questo esempio, sarà denominato ContosoSpatialAwareness e si trova 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 specificherà 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 trova nella cartella ContosoSpatialAwareness\Editor. Questa definizione di assembly conterrà un riferimento all'assembly ContosoSpatialAwareness, nonché:

  • 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 riconoscimento 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 alle preferenze dello sviluppatore. È probabile che la soluzione più comune sia generare un file unitypackage e distribuirsi tramite Unity Asset Store.

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

Vedi anche