Dela via


Konfigurera nätobservatörer via kod – MRTK2

I den här artikeln beskrivs några av de viktigaste mekanismerna och API:erna för att programmatiskt konfigurera Spatial Awareness-systemet och relaterade Mesh Observer-dataproviders .

Åtkomst till nätobservatörer

Mesh Observer-klasser som implementerar IMixedRealitySpatialAwarenessMeshObserver gränssnittet tillhandahåller plattformsspecifika nätdata till systemet för rumslig medvetenhet. Flera observatörer kan konfigureras i Spatial Awareness-profilen.

Åtkomst till dataleverantörerna i Spatial Awareness-systemet är oftast detsamma som för andra Mixed Reality Toolkit-tjänsten. Tjänsten Spatial Awareness måste skickas till IMixedRealityDataProviderAccess gränssnittet för åtkomst via API:erna GetDataProvider<T> , som sedan kan användas för att komma åt Mesh Observer-objekt direkt vid körning.

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

Hjälpverktyget CoreServices.GetSpatialAwarenessSystemDataProvider<T>() förenklar det här åtkomstmönstret enligt nedan.

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

Starta och stoppa nätobservation

En av de vanligaste uppgifterna när du hanterar Spatial Awareness-systemet är att stänga av/aktivera funktionen dynamiskt vid körning. Detta görs per övervakare via API:erna IMixedRealitySpatialAwarenessObserver.Resume och 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();

Den här kodfunktionen kan också förenklas via åtkomst via Spatial Awareness-systemet direkt.

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

Starta och stoppa all nätobservation

Det är vanligtvis praktiskt att starta/stoppa all nätobservation i programmet. Detta kan uppnås genom hjälpsamma SPATIAL Awareness system API:er, ResumeObservers() och SuspendObservers().

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

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

Räkna upp och komma åt näten

Åtkomst till näten kan göras per observatör och sedan räknas upp genom de nät som mesh-observatören känner till via API:et IMixedRealitySpatialAwarenessMeshObserver .

Om du kör i redigeraren kan du använda AssetDatabase.CreateAsset() för att spara objektet i Mesh en tillgångsfil.

Om du kör på enheten finns det många community- och store-plugin-program som är tillgängliga för att serialisera MeshFilter data till en modellfiltyp.

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

Visa och dölja det rumsliga nätet

Det går att programmatiskt dölja/visa nät med hjälp av exempelkoden nedan:

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

Registrera för mesh-observationshändelser

Komponenter kan implementera IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> och sedan registrera med Spatial Awareness-systemet för att ta emot Mesh Observation-händelser.

Skriptet DemoSpatialMeshHandler (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) är ett användbart exempel och utgångspunkt för att lyssna på Mesh Observer-händelser.

Det här är ett förenklat exempel på DemoSpatialMeshHandler-skript och Mesh Observation-händelselyssning.

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

Se även