Configuración de observadores de malla mediante código: MRTK2

En este artículo se describen 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 De observador de malla que implementan la interfaz proporcionan datos de malla específicos de la IMixedRealitySpatialAwarenessMeshObserver plataforma al sistema de reconocimiento espacial. Varios observadores se pueden configurar 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 servicio Mixed Reality Toolkit. El servicio Spatial Awareness se debe convertir en la IMixedRealityDataProviderAccess interfaz para acceder a través de las GetDataProvider<T> API, que luego se puede usar para acceder a los objetos de Mesh Observer directamente en 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 está desactivando o activando dinámicamente la característica en tiempo de ejecución. Esto se realiza por observador a través de las IMixedRealitySpatialAwarenessObserver.Resume API y 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();

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

Inicio y detención de todas las observaciones de malla

Por lo general, es conveniente iniciar o detener toda la observación de malla en la aplicación. Esto se puede lograr mediante las API útiles del sistema de reconocimiento espacial y ResumeObservers()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 para ese observador de malla a través de la IMixedRealitySpatialAwarenessMeshObserver API.

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

Si se ejecuta en el dispositivo, hay muchos complementos de la comunidad y almacenan los complementos disponibles para serializar los MeshFilter datos en un tipo de archivo de modelo (ejemplo de 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 mediante 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 después registrarse con el sistema de reconocimiento espacial para recibir eventos de observación de malla.

El DemoSpatialMeshHandler script (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) es un ejemplo útil y un punto de partida para escuchar eventos 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
    }
}

Vea también