Konfigurieren von Gitterbeobachtern über Code — MRTK2

In diesem Artikel werden einige der wichtigsten Mechanismen und APIs diskutiert, um das Räumliche Bewusstseinssystem programmgesteuert zu konfigurieren und verwandte Mesh Beobachterdatenanbieter zu konfigurieren.

Zugriff auf Gitterbeobachter

Mesh Beobachterklassen, die die IMixedRealitySpatialAwarenessMeshObserver Schnittstelle implementieren, bieten plattformspezifische Gitterdaten im Räumlichen Bewusstseinssystem an. Mehrere Beobachter können im Räumlichen Bewusstseinsprofil konfiguriert werden.

Der Zugriff auf die Datenanbieter des Räumlichen Bewusstseinssystems entspricht hauptsächlich allen anderen Mixed Reality Toolkit-Diensten. Der Spatial Awareness-Dienst muss an die Schnittstelle gecastet werden, um über die IMixedRealityDataProviderAccess APIs zuzugreifen, die dann verwendet werden können, um direkt zur Laufzeit auf die GetDataProvider<T> Mesh Observer-Objekte zuzugreifen.

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

Der CoreServices.GetSpatialAwarenessSystemDataProvider<T>() Hilfsprogramm vereinfacht dieses Zugriffsmuster wie unten gezeigt.

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

Starten und Beenden der Gitterbeobachtung

Eine der am häufigsten verwendeten Aufgaben beim Umgang mit dem Räumlichen Bewusstseinssystem ist das Deaktivieren/Aktivieren des Features dynamisch zur Laufzeit. Dies erfolgt pro Beobachter über die und IMixedRealitySpatialAwarenessObserver.Suspend APIsIMixedRealitySpatialAwarenessObserver.Resume.

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

Diese Codefunktionalität kann auch über den direkten Zugriff über das Räumliche Bewusstseinssystem vereinfacht werden.

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

Starten und Beenden aller Gitterüberwachung

Es ist in der Regel bequem, alle Gitterbeobachtungen in der Anwendung zu starten/zu beenden. Dies kann durch die hilfreichen APIs des räumlichen Bewusstseinssystems erreicht werden. ResumeObservers()SuspendObservers()

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

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

Aufzählen und Zugreifen auf die Gitter

Der Zugriff auf die Gitter kann pro Beobachter erfolgen und dann über die Gitter aufgezählt werden, die für diese Mesh Observer über die IMixedRealitySpatialAwarenessMeshObserver API bekannt sind.

Wenn sie im Editor ausgeführt werden, kann man das AssetDatabase.CreateAsset()Mesh Objekt in einer Assetdatei speichern.

Wenn sie auf dem Gerät ausgeführt werden, gibt es viele Community- und Store-Plug-Ins, um die MeshFilter Daten in einen Modelldateityp (OBJ-Beispiel) zu serialisieren.

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

Anzeigen und Ausblenden des räumlichen Gitters

Es ist möglich, Gitter programmgesteuert auszublenden/anzuzeigen, indem Sie den beispielcode unten verwenden:

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

Registrieren für Gitterbeobachtungsereignisse

Komponenten können das IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> Raumbewusstseinssystem implementieren und dann registrieren, um Mesh Beobachtungsereignisse zu erhalten.

Das DemoSpatialMeshHandler Skript (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) ist ein nützliches Beispiel und Ausgangspunkt für das Hören von Mesh Beobachterereignissen.

Dies ist ein vereinfachtes Beispiel für DemoSpatialMeshHandler-Skript und Mesh Beobachtungsereignishörung.

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

Siehe auch