Mesh-waarnemers configureren via code

In dit artikel worden enkele van de belangrijkste mechanismen en API's besproken voor het programmatisch configureren van het Spatial Awareness-systeem en gerelateerde Mesh Observer-gegevensproviders.

Toegang tot mesh-waarnemers

Mesh Observer-klassen die de IMixedRealitySpatialAwarenessMeshObserver interface implementeren, bieden platformspecifieke mesh-gegevens voor het Spatial Awareness-systeem. Er kunnen meerdere waarnemers worden geconfigureerd in het profiel Spatial Awareness.

Toegang tot de gegevensproviders van het Spatial Awareness-systeem is grotendeels hetzelfde als voor andere Mixed Reality Toolkit service. De Spatial Awareness-service moet worden gecast naar de interface voor toegang via de API's, die vervolgens kunnen worden gebruikt om rechtstreeks tijdens runtime toegang te krijgen tot de IMixedRealityDataProviderAccess GetDataProvider<T> Mesh Observer-objecten.

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

De CoreServices.GetSpatialAwarenessSystemDataProvider<T>() helper vereenvoudigt dit toegangspatroon, zoals hieronder wordt gedemonstreerd.

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

Mesh-observatie starten en stoppen

Een van de meest voorkomende taken bij het werken met het spatial awareness-systeem is het dynamisch in-/uitschakelen van de functie tijdens runtime. Dit wordt per waarnemer gedaan via de IMixedRealitySpatialAwarenessObserver.Resume IMixedRealitySpatialAwarenessObserver.Suspend API's en .

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

Deze codefunctionaliteit kan ook worden vereenvoudigd via rechtstreeks toegang via het Spatial Awareness-systeem.

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

Alle mesh-observatie starten en stoppen

Het is over het algemeen handig om alle mesh-waarnemingen in de toepassing te starten/stoppen. Dit kan worden bereikt met behulp van de handige SYSTEEM-API's voor ruimtelijke kennis, ResumeObservers() en SuspendObservers() .

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

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

De meshes opsnoemen en openen

Toegang tot de meshes kan worden gedaan per waarnemer en vervolgens door de meshes die bekend zijn bij die Mesh-waarnemer, opsnoemen via de IMixedRealitySpatialAwarenessMeshObserver API.

Als deze wordt uitgevoerd in de editor, kunt u de gebruiken AssetDatabase.CreateAsset() om het object op te slaan in een Mesh assetbestand.

Als deze worden uitgevoerd op een apparaat, zijn er veel community- en store-invoegvoegingen beschikbaar om de gegevens te serialiseren naar een MeshFilter modelbestandstype(OBJ-voorbeeld).

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

De ruimtelijke mesh weergeven en verbergen

Het is mogelijk om meshes programmatisch te verbergen/weer te geven met behulp van de onderstaande voorbeeldcode:

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

Registreren voor mesh-observatiegebeurtenissen

Onderdelen kunnen de implementeren IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> en vervolgens registreren bij het Spatial Awareness-systeem om Mesh Observation-gebeurtenissen te ontvangen.

Het DemoSpatialMeshHandler script (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) is een nuttig voorbeeld en beginpunt voor het luisteren naar Mesh Observer-gebeurtenissen.

Dit is een vereenvoudigd voorbeeld van demoSpatialMeshHandler-script en Mesh Observation-gebeurtenis die luistert.

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

Zie ook