Configurando observadores de malha por meio de código — MRTK2

Este artigo discutirá alguns dos principais mecanismos e APIs para configurar programaticamente o sistema de Reconhecimento Espacial e os provedores de dados relacionados ao Mesh Observer .

Acessando observadores de malha

As classes do Observador de Malha que implementam a IMixedRealitySpatialAwarenessMeshObserver interface fornecem dados de malha específicos da plataforma para o sistema de Reconhecimento Espacial. Vários Observadores podem ser configurados no perfil de Reconhecimento Espacial.

Acessar os provedores de dados do sistema de Reconhecimento Espacial é principalmente o mesmo que para qualquer outro serviço Realidade Misturada Toolkit. O serviço de Reconhecimento Espacial deve ser convertido na IMixedRealityDataProviderAccess interface para acessar por meio das GetDataProvider<T> APIs, que podem ser utilizadas para acessar os objetos do Observador de Malha diretamente em 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>() auxiliar simplifica esse 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);

Iniciando e parando a observação de malha

Uma das tarefas mais comuns ao lidar com o sistema de Reconhecimento Espacial é desativar/ativar o recurso dinamicamente no runtime. Isso é feito por Observador por meio 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();

Essa funcionalidade de código também pode ser simplificada por meio do acesso por meio do sistema de Reconhecimento Espacial diretamente.

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

Iniciando e parando toda a observação de malha

Geralmente, é conveniente iniciar/parar toda a observação de malha no aplicativo. Isso pode ser obtido por meio das APIs ResumeObservers() úteis do sistema de Reconhecimento Espacial e SuspendObservers().

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

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

Enumerando e acessando as malhas

O acesso às malhas pode ser feito por Observador e, em seguida, enumerar por meio das malhas conhecidas por esse Observador de Malha por meio da IMixedRealitySpatialAwarenessMeshObserver API.

Se estiver em execução no editor, é possível usar o AssetDatabase.CreateAsset() para salvar o Mesh objeto em um arquivo de ativo.

Se estiver em execução no dispositivo, há muitos plug-ins de comunidade e armazenamento disponíveis para serializar os MeshFilter dados em um tipo de arquivo 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
}

Mostrando e ocultando a malha espacial

É possível ocultar/mostrar malhas programaticamente usando 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;

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

Os componentes podem implementar o IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> e, em seguida, registrar-se no sistema de Reconhecimento 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 ouvir eventos do Observador de Malha.

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

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

Confira também