Mesh-waarnemers configureren via code — MRTK2
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 aan het Spatial Awareness-systeem. Meerdere waarnemers kunnen worden geconfigureerd in het spatial awareness-profiel.
De toegang tot de gegevensproviders van het Spatial Awareness-systeem is grotendeels hetzelfde als voor elke andere Mixed Reality Toolkit-service. De Spatial Awareness-service moet naar de IMixedRealityDataProviderAccess
interface worden verzonden om toegang te krijgen via de GetDataProvider<T>
API's, die vervolgens kan worden gebruikt om rechtstreeks tijdens runtime toegang te krijgen tot de 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 weergegeven.
// 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 gebeurt per waarnemer via de IMixedRealitySpatialAwarenessObserver.Resume
API's en 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();
Deze codefunctionaliteit kan ook worden vereenvoudigd via toegang via het Spatial Awareness-systeem.
var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);
Alle mesh-observaties starten en stoppen
Het is over het algemeen handig om alle mesh-observaties in de toepassing te starten/stoppen. Dit kan worden bereikt met behulp van de handige Spatial Awareness-systeem-API's, ResumeObservers()
en SuspendObservers()
.
// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();
// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();
Inventarisatie en toegang tot de meshes
Toegang tot de meshes kan per waarnemer worden uitgevoerd en vervolgens de meshes opsommen die bekend zijn bij die Mesh-waarnemer via de IMixedRealitySpatialAwarenessMeshObserver
API.
Als u in de editor wordt uitgevoerd, kunt u de AssetDatabase.CreateAsset()
gebruiken om het Mesh
object op te slaan in een assetbestand.
Als u op een apparaat wordt uitgevoerd, zijn er veel invoegtoepassingen voor community's en winkels beschikbaar om de MeshFilter
gegevens in een modelbestandstype te serialiseren.
// 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
}
Het ruimtelijk 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-waarnemingsevenementen
Onderdelen kunnen de IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>
implementeren 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 uitgangspunt voor het luisteren naar Mesh Observer-gebeurtenissen.
Dit is een vereenvoudigd voorbeeld van DemoSpatialMeshHandler-script en Mesh Observation-gebeurtenis luisteren.
// 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
}
}