Configuration des observateurs de maillage via du code — MRTK2

Cet article décrit certains des mécanismes et API clés pour configurer par programmation le système de sensibilisation spatiale et les fournisseurs de données Mesh Observateur associés.

Accès aux observateurs de maillage

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

L’accès aux fournisseurs de données du système de sensibilisation spatiale est principalement identique à tout autre service Mixed Reality Toolkit. Le service De sensibilisation spatiale doit être converti à l’interface IMixedRealityDataProviderAccess pour 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 de maillage

L’une des tâches les plus courantes lors de la gestion du système de sensibilisation spatiale permet de désactiver/désactiver dynamiquement la fonctionnalité au moment de l’exécution. Cette opération est effectuée par observateur via les API et IMixedRealitySpatialAwarenessObserver.Suspend les IMixedRealitySpatialAwarenessObserver.Resume API.

// 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 via le système de sensibilisation spatiale directement.

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

Démarrage et arrêt de toutes les observations de maillage

Il est généralement pratique de démarrer/arrêter toutes les observations de maillage dans l’application. Cela peut être réalisé par le biais des API de système de sensibilisation spatiale utiles, ResumeObservers() et 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 énumérer par le biais des maillages connus de ce Mesh Observer via l’APIIMixedRealitySpatialAwarenessMeshObserver.

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

S’il s’exécute sur l’appareil, il existe de nombreux plug-ins de la communauté et de magasin disponibles pour sérialiser les MeshFilter données dans un type de fichier modèle(EXEMPLE 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
}

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, IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> puis s’inscrire auprès du système de sensibilisation spatiale pour recevoir Mesh événements d’observation.

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

Il s’agit d’un exemple simplifié de script DemoSpatialMeshHandler et d’écoute des événements d’observation Mesh.

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