Configurazione degli osservatori mesh tramite codice - MRTK2

Questo articolo illustra alcuni dei meccanismi chiave e delle API per configurare a livello di codice il sistema di consapevolezza spaziale e i provider di dati Mesh Observer correlati.

Accesso agli osservatori mesh

Le classi Observer mesh che implementano l'interfaccia IMixedRealitySpatialAwarenessMeshObserver forniscono dati mesh specifici della piattaforma al sistema di consapevolezza spaziale. È possibile configurare più osservatori nel profilo di consapevolezza spaziale.

L'accesso ai provider di dati del sistema di consapevolezza spaziale è principalmente uguale a quello di qualsiasi altro servizio Realtà mista Toolkit. Il servizio Di consapevolezza spaziale deve essere sottoposto a cast all'interfaccia IMixedRealityDataProviderAccess per accedere tramite le GetDataProvider<T> API, che possono quindi essere usate per accedere direttamente agli oggetti Observer mesh in fase di esecuzione.

// Use CoreServices to quickly get access to the IMixedRealitySpatialAwarenessSystem
var spatialAwarenessService = CoreServices.SpatialAwarenessSystem;

// Cast to the IMixedRealityDataProviderAccess to get access to the data providers
var dataProviderAccess = spatialAwarenessService as IMixedRealityDataProviderAccess;

var meshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

L'helper CoreServices.GetSpatialAwarenessSystemDataProvider<T>() semplifica questo modello di accesso, come illustrato di seguito.

// Get the first Mesh Observer available, generally we have only one registered
var meshObserver = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Get the SpatialObjectMeshObserver specifically
var meshObserverName = "Spatial Object Mesh Observer";
var spatialObjectMeshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

Avvio e arresto dell'osservazione mesh

Una delle attività più comuni durante la gestione del sistema di consapevolezza spaziale disattiva/attiva in modo dinamico la funzionalità. Questa operazione viene eseguita per Osservatore tramite le IMixedRealitySpatialAwarenessObserver.Resume API e IMixedRealitySpatialAwarenessObserver.Suspend .

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Suspends observation of spatial mesh data
observer.Suspend();

// Resumes observation of spatial mesh data
observer.Resume();

Questa funzionalità di codice può essere semplificata anche tramite l'accesso tramite il sistema di consapevolezza spaziale direttamente.

var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

Avvio e arresto di tutte le osservazioni mesh

In genere, è utile avviare/arrestare tutte le osservazioni mesh nell'applicazione. Ciò può essere ottenuto tramite le API ResumeObservers() del sistema di consapevolezza spaziale utili e SuspendObservers().

// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();

// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();

Enumerazione e accesso alle mesh

L'accesso alle mesh può essere eseguito per Osservatore e quindi enumerazione tramite le mesh note a tale Osservatore mesh tramite l'API IMixedRealitySpatialAwarenessMeshObserver .

Se in esecuzione nell'editor, è possibile usare l'oggetto AssetDatabase.CreateAsset() per salvare l'oggetto Mesh in un file di asset.

Se in esecuzione nel dispositivo, sono disponibili molti plug-in community e archivia per serializzare i MeshFilter dati in un tipo di file modello.

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Loop through all known Meshes
foreach (SpatialAwarenessMeshObject meshObject in observer.Meshes.Values)
{
    Mesh mesh = meshObject.Filter.mesh;
    // Do something with the Mesh object
}

Visualizzazione e nascondere la mesh spaziale

È possibile nascondere/mostrare mesh a livello di codice usando il codice di esempio seguente:

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Set to not visible
observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;

// Set to visible and the Occlusion material
observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.Occlusion;

Registrazione per gli eventi di osservazione mesh

I componenti possono implementare e IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> quindi registrare con il sistema Di consapevolezza spaziale per ricevere eventi di osservazione mesh.

Lo DemoSpatialMeshHandler script (Assets/MRTK/Examples/Demos/SpatialAwareness/Script) è un esempio utile e punto di partenza per l'ascolto degli eventi di Mesh Observer.

Questo è un esempio semplificato di script DemoSpatialMeshHandler e l'ascolto dell'evento di osservazione mesh.

// Simplify type
using SpatialAwarenessHandler = IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>;

public class MyMeshObservationExample : MonoBehaviour, SpatialAwarenessHandler
{
    private void OnEnable()
    {
        // Register component to listen for Mesh Observation events, typically done in OnEnable()
        CoreServices.SpatialAwarenessSystem.RegisterHandler<SpatialAwarenessHandler>(this);
    }

    private void OnDisable()
    {
        // Unregister component from Mesh Observation events, typically done in OnDisable()
        CoreServices.SpatialAwarenessSystem.UnregisterHandler<SpatialAwarenessHandler>(this);
    }

    public virtual void OnObservationAdded(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }

    public virtual void OnObservationUpdated(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }

    public virtual void OnObservationRemoved(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }
}

Vedi anche