Configuration des observateurs de maillage via du code — MRTK2

Cet article décrit certains des principaux mécanismes et API permettant de configurer par programme le système de reconnaissance spatiale et les fournisseurs de données Mesh Observer associés.

Accès aux observateurs de maillage

Les classes Mesh Observer qui implémentent l’interface IMixedRealitySpatialAwarenessMeshObserver fournissent des données de maillage spécifiques à la plateforme au système Spatial Awareness. Plusieurs observateurs peuvent être configurés dans le profil Spatial Awareness.

L’accès aux fournisseurs de données du système Spatial Awareness est principalement le même que pour tout autre service Mixed Reality Toolkit. Le service Spatial Awareness doit être converti en IMixedRealityDataProviderAccess interface pour y accéder via les GetDataProvider<T> API, qui peuvent ensuite être utilisées pour accéder aux objets Mesh Observer directement au moment de l’exécution.

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

L’assistance CoreServices.GetSpatialAwarenessSystemDataProvider<T>() simplifie ce modèle d’accès, comme illustré ci-dessous.

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

Démarrage et arrêt de l’observation du maillage

L’une des tâches les plus courantes lors de la gestion du système de reconnaissance spatiale consiste à désactiver/activer dynamiquement la fonctionnalité au moment de l’exécution. Cette opération est effectuée par Observateur via les IMixedRealitySpatialAwarenessObserver.Resume API et 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();

Cette fonctionnalité de code peut également être simplifiée via l’accès directement via le système Spatial Awareness.

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

Démarrage et arrêt de l’observation de tous les maillages

Il est généralement pratique de démarrer/arrêter toutes les observations de maillage dans l’application. Pour ce faire, vous pouvez utiliser les API système de reconnaissance spatiale utiles et ResumeObservers()SuspendObservers().

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

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

Énumération et accès aux maillages

L’accès aux maillages peut être effectué par observateur, puis l’énumération via les maillages connus de cet observateur de maillage via l’API IMixedRealitySpatialAwarenessMeshObserver .

Si vous exécutez dans l’éditeur, vous pouvez utiliser pour AssetDatabase.CreateAsset() enregistrer l’objet Mesh dans un fichier de ressources.

En cas d’exécution sur l’appareil, de nombreux plug-ins de communauté et de magasin sont disponibles pour sérialiser les MeshFilter données dans un type de fichier de modèle.

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

Affichage et masquage du maillage spatial

Il est possible de masquer/afficher des maillages par programmation à l’aide de l’exemple de code ci-dessous :

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

Inscription aux événements d’observation de maillage

Les composants peuvent implémenter, puis s’inscrire IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> auprès du système de reconnaissance spatiale pour recevoir des événements d’observation de maillage.

Le DemoSpatialMeshHandler script (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) est un exemple utile et un point de départ pour écouter les événements Mesh Observer.

Il s’agit d’un exemple simplifié de script DemoSpatialMeshHandler et d’un événement Mesh Observation à l’écoute.

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

Voir aussi