Konfigurieren von Gitterbeobachtern per Code — MRTK2
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.
Zugriff auf Gitterbeobachter
Mesh Observer-Klassen, die die IMixedRealitySpatialAwarenessMeshObserver
Schnittstelle implementieren, stellen plattformspezifische Gitterdaten für das Spatial Awareness-System bereit. Mehrere Beobachter können im Spatial Awareness-Profil konfiguriert werden.
Der Zugriff auf die Datenanbieter des Spatial Awareness-Systems ist größtenteils identisch mit jedem anderen Mixed Reality Toolkit-Dienst. Der Spatial Awareness-Dienst muss für den Zugriff über die GetDataProvider<T>
APIs in die IMixedRealityDataProviderAccess
Schnittstelle umgewandelt werden, die dann für den direkten Zugriff auf die Mesh Observer-Objekte zur Laufzeit verwendet werden kann.
// 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>()
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 häufigsten Aufgaben beim Umgang mit dem Spatial Awareness-System ist das dynamische Ausschalten/Aktivieren des Features zur Laufzeit. Dies erfolgt pro Observer ü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 aller Gitterbeobachtungen
Es ist in der Regel praktisch, alle Gitterbeobachtungen in der Anwendung zu starten/zu beenden. Dies kann durch die hilfreichen APIs ResumeObservers()
des Spatial Awareness-Systems und SuspendObservers()
erreicht werden.
// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();
// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();
Auflisten und Zugreifen auf die Gitter
Der Zugriff auf die Gitter kann pro Observer erfolgen und dann über die Gitter aufgezählt werden, die diesem Mesh Observer über die IMixedRealitySpatialAwarenessMeshObserver
API bekannt sind.
Wenn Sie im Editor ausgeführt werden, können Sie das AssetDatabase.CreateAsset()
Mesh
Objekt in einer Objektdatei speichern.
Wenn Sie auf einem Gerät ausgeführt werden, stehen viele Community- und Speicher-Plug-Ins zur Verfügung, um die MeshFilter
Daten in einen Modelldateityp 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
}
Ein- und Ausblenden des Räumlichen Gitters
Es ist möglich, Gitter mit dem folgenden Beispielcode programmgesteuert 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 das IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>
implementieren 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 von Mesh Observer-Ereignissen.
Dies ist ein vereinfachtes Beispiel für das Überwachen des DemoSpatialMeshHandler-Skripts und des Mesh-Beobachtungsereignisses.
// 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
}
}