Configuración de observadores de malla mediante código

En este artículo se analizará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 puede usar para acceder a los objetos de Mesh Observer directamente en IMixedRealityDataProviderAccess GetDataProvider<T> tiempo de 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 mediante el acceso directamente a través del sistema de reconocimiento espacial.

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 toda la observación 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, enumerarse a través de las mallas conocidas para 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 muchos complementos de comunidad y almacenamiento disponibles para serializar los datos en un tipo de archivo de MeshFilter modelo(ejemplo OBJ).

// 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 para eventos de observación de malla

Los componentes pueden implementar IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> y, a continuación, registrarse con 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 observación de malla.

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

Consulte también