Konfigurieren von Mesh-Beobachtern über Code

In diesem Artikel werden einige der wichtigsten Mechanismen und APIs zum programmgesteuerten Konfigurieren des Spatial Awareness-Systems und der zugehörigen Mesh Observer-Datenanbieter erläutert.

Zugreifen auf Mesh-Beobachter

Mesh Observer-Klassen, die die -Schnittstelle implementieren, IMixedRealitySpatialAwarenessMeshObserver stellen plattformspezifische Gitternetzdaten für das Spatial Awareness-System bereit. Mehrere Beobachter können im Profil räumliche Wahrnehmung konfiguriert werden.

Der Zugriff auf die Datenanbieter des Spatial Awareness-Systems ist größtenteils identisch mit jedem anderen Mixed Reality Toolkit-Dienst. Der Dienst für räumliche Wahrnehmung muss in die Schnittstelle umgecastet IMixedRealityDataProviderAccess werden, um über die APIs darauf zugreifen zu können, die dann verwendet GetDataProvider<T> werden können, um direkt zur Laufzeit auf die 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>();

Das CoreServices.GetSpatialAwarenessSystemDataProvider<T>() Hilfsmuster 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 Gitternetzüberwachung

Eine der häufigsten Aufgaben beim Umgang mit dem System für räumliche Wahrnehmung besteht darin, das Feature zur Laufzeit dynamisch zu deaktivieren bzw. zu aktivieren. Dies erfolgt pro Beobachter über die IMixedRealitySpatialAwarenessObserver.Resume APIs und 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();

Diese Codefunktionalität kann auch über den direkten Zugriff über das Spatial Awareness-System vereinfacht werden.

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

Starten und Beenden der gesamten Gitternetzüberwachung

Es ist im Allgemeinen praktisch, alle Gitternetzüberwachungen in der Anwendung zu starten/zu beenden. Dies kann über die hilfreichen Spatial Awareness-System-APIs und erreicht ResumeObservers()SuspendObservers() werden.

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

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

Aufzählen und Zugreifen auf die Gitternetze

Der Zugriff auf die Gitternetze kann pro Observer erfolgen und dann über die API durch die Gitternetze aufzählen, die diesem Mesh-Beobachter bekannt IMixedRealitySpatialAwarenessMeshObserver sind.

Wenn sie im Editor ausgeführt wird, können Sie verwenden, AssetDatabase.CreateAsset() um das Objekt in einer Mesh Medienobjektdatei zu speichern.

Wenn sie auf einem Gerät ausgeführt wird, stehen viele Community- und Store-Plug-Ins zur Verfügung, um die MeshFilter Daten in einen Modelldateityp zu serialisieren(MeshFilter).

// 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, Gitternetze programmgesteuert mithilfe des folgenden Beispielcodes auszublenden/anzuzeigen:

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

Komponenten können implementieren IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> und sich dann beim Spatial Awareness-System registrieren, um Mesh-Beobachtungsereignisse zu empfangen.

Das DemoSpatialMeshHandler Skript (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) ist ein nützliches Beispiel und Ausgangspunkt für das Lauschen auf Mesh Observer-Ereignisse.

Dies ist ein vereinfachtes Beispiel für das DemoSpatialMeshHandler-Skript und das Lauschen von Mesh Observation-Ereignisse.

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