Configurar observadores de malha via código — MRTK2

Este artigo irá discutir alguns dos principais mecanismos e APIs para configurar programáticamente o sistema de sensibilização espacial e fornecedores de dados relacionados com o Mesh Observer .

Aceder a observadores de malha

As classes de Redes Observadores que implementam a IMixedRealitySpatialAwarenessMeshObserver interface fornecem dados de malha específicos da plataforma para o sistema de Sensibilização Espacial. Vários Observadores podem ser configurados no perfil de Consciência Espacial.

O acesso aos fornecedores de dados do sistema de sensibilização espacial é maioritariamente o mesmo que em qualquer outro serviço Mixed Reality Toolkit. O serviço de Sensibilização Espacial deve ser lançado para a IMixedRealityDataProviderAccess interface para aceder através das GetDataProvider<T> APIs, que podem ser utilizados para aceder diretamente aos objetos do Mesh Observer no tempo de execução.

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

O CoreServices.GetSpatialAwarenessSystemDataProvider<T>() ajudante simplifica este padrão de acesso como demonstrado abaixo.

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

Início e paragem da observação da malha

Uma das tarefas mais comuns ao lidar com o sistema de Sensibilização Espacial é desligar/ligar a funcionalidade de forma dinâmica no tempo de funcionamento. Isto é feito por Observador através das IMixedRealitySpatialAwarenessObserver.Resume APIs e IMixedRealitySpatialAwarenessObserver.Suspend apis.

// 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 funcionalidade de código também pode ser simplificada através do acesso através do sistema de Sensibilização Espacial diretamente.

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

Começando e interrompendo toda a observação da malha

É geralmente conveniente iniciar/parar toda a observação de malha na aplicação. Isto pode ser conseguido através do útil sistema de sensibilização espacial APIs, ResumeObservers() e SuspendObservers().

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

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

Enumerar e aceder às malhas

O acesso às malhas pode ser feito pelo Observador e, em seguida, enumerar através das malhas conhecidas pelo Observador através da IMixedRealitySpatialAwarenessMeshObserver API.

Se correr em editor, pode-se usar o AssetDatabase.CreateAsset() para guardar o Mesh objeto para um ficheiro de ativos.

Se estiver em funcionamento no dispositivo, existem muitos plugins de comunidade e loja disponíveis para serializar os MeshFilter dados num tipo de ficheiro modelo (OBJ Exemplo).

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

Mostrando e escondendo a malha espacial

É possível ocultar programaticamente/mostrar malhas usando o código de amostra abaixo:

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

Registo de eventos de observação de malha

Os componentes podem implementar o IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> e depois registar-se com o sistema de Sensibilização Espacial para receber eventos de Observação de Malha.

O DemoSpatialMeshHandler script (Ativos/MRTK/Exemplos/Demos/SpatialAwareness/Scripts) é um exemplo útil e ponto de partida para ouvir eventos do Mesh Observer.

Este é um exemplo simplificado de script DemoSpatialMeshHandler e de observação de malha.

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

Ver também