Configuración de observadores de malla mediante código

En este artículo se detendrán algunos de los mecanismos clave y las API para configurar mediante programación el sistema de reconocimiento espacial y los proveedores de datos de Mesh Observer relacionados.

Acceso a observadores de malla

Las clases Mesh Observer que implementan la interfaz proporcionan datos de malla específicos de la IMixedRealitySpatialAwarenessMeshObserver plataforma al sistema de reconocimiento espacial. Se pueden configurar varios observadores en el perfil de reconocimiento espacial.

El acceso a los proveedores de datos del sistema de reconocimiento espacial es principalmente el mismo que para cualquier otro Mixed Reality Toolkit servicio. El servicio de reconocimiento espacial se debe convertir a la interfaz para acceder a través de las API, que luego se pueden usar para acceder a los objetos De observador de IMixedRealityDataProviderAccess malla directamente en tiempo de GetDataProvider<T> ejecución.

// 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>();

El CoreServices.GetSpatialAwarenessSystemDataProvider<T>() asistente simplifica este patrón de acceso, como se muestra a continuación.

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

Inicio y detención de la observación de malla

Una de las tareas más comunes al tratar con el sistema de reconocimiento espacial es desactivar o activar dinámicamente la característica en tiempo de ejecución. Esto se realiza por observador a través de IMixedRealitySpatialAwarenessObserver.Resume las IMixedRealitySpatialAwarenessObserver.Suspend API y .

// 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();

Esta funcionalidad de código también se puede simplificar a través del acceso a través del sistema de reconocimiento espacial directamente.

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

Iniciar y detener toda la observación de malla

Por lo general, es conveniente iniciar o detener todas las observaciones de malla en la aplicación. Esto se puede lograr a través de las útiles API del sistema de reconocimiento espacial, ResumeObservers() y SuspendObservers() .

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

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

Enumeración y acceso a las mallas

El acceso a las mallas se puede realizar por observador y, a continuación, enumerar a través de las mallas conocidas por ese observador de malla a través de la IMixedRealitySpatialAwarenessMeshObserver API.

Si se ejecuta en el editor, se puede usar AssetDatabase.CreateAsset() para guardar el objeto en un archivo de Mesh recursos.

Si se ejecuta en el dispositivo, hay muchas comunidades y complementos de almacenamiento disponibles para serializar los datos en un tipo de archivo MeshFilter de modelo(MeshFilter).

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

Mostrar y ocultar la malla espacial

Es posible ocultar o mostrar mallas mediante programación con el código de ejemplo siguiente:

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

Registro de eventos de observación de malla

Los componentes pueden implementar IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> y, a continuación, registrarse en el sistema de reconocimiento espacial para recibir eventos de observación de malla.

El script (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) es un ejemplo útil y un punto de partida para escuchar eventos DemoSpatialMeshHandler de Mesh Observer.

Este es un ejemplo simplificado del script DemoSpatialMeshHandler y la escucha de eventos de mesh observation.

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

Vea también