Configurar observadores de malha através de código – MRTK2

Este artigo abordará alguns dos principais mecanismos e APIs para configurar programaticamente o sistema de Sensibilização Espacial e os fornecedores de dados relacionados do Mesh Observer .

Aceder a observadores de malha

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

O acesso aos fornecedores de dados do sistema de Sensibilização Espacial é maioritariamente igual ao de qualquer outro Mixed Reality serviço Toolkit. O serviço de Sensibilização Espacial tem de ser convertido na IMixedRealityDataProviderAccess interface para aceder através das GetDataProvider<T> APIs, que podem ser utilizadas para aceder aos objetos do Mesh Observer diretamente no runtime.

// 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>() programa auxiliar simplifica este padrão de acesso, conforme 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);

Iniciar e parar a observação de malha

Uma das tarefas mais comuns ao lidar com o sistema de Sensibilização Espacial é desativar/ativar a funcionalidade dinamicamente no runtime. Isto é feito por Observador através das IMixedRealitySpatialAwarenessObserver.Resume APIs 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();

Esta funcionalidade de código também pode ser simplificada através do acesso diretamente através do sistema de Sensibilização Espacial.

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

Iniciar e parar todas as observações de malha

Geralmente, é conveniente iniciar/parar toda a observação de malha na aplicação. Isto pode ser conseguido através das APIs úteis do sistema de Sensibilização Espacial e ResumeObservers()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 por Observador e, em seguida, enumerar através das malhas conhecidas pelo Observador de Malha através da IMixedRealitySpatialAwarenessMeshObserver API.

Se estiver em execução no editor, pode-se utilizar o AssetDatabase.CreateAsset() para guardar o Mesh objeto num ficheiro de recursos.

Se estiver em execução no dispositivo, existem muitos plug-ins de comunidade e arquivo disponíveis para serializar os MeshFilter dados num tipo de ficheiro de modelo.

// 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 e ocultar a malha espacial

É possível ocultar/mostrar malhas programaticamente com o código de exemplo 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;

Registar-se para eventos de observação de malha

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

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

Este é um exemplo simplificado do script DemoSpatialMeshHandler e da escuta de eventos 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