Configurazione degli osservatori mesh tramite codice - MRTK2
Questo articolo illustra alcuni dei meccanismi chiave e delle API per configurare a livello di codice il sistema di consapevolezza spaziale e i provider di dati Mesh Observer correlati.
Accesso agli osservatori mesh
Le classi Observer mesh che implementano l'interfaccia IMixedRealitySpatialAwarenessMeshObserver
forniscono dati mesh specifici della piattaforma al sistema di consapevolezza spaziale. È possibile configurare più osservatori nel profilo di consapevolezza spaziale.
L'accesso ai provider di dati del sistema di consapevolezza spaziale è principalmente uguale a quello di qualsiasi altro servizio Realtà mista Toolkit. Il servizio Di consapevolezza spaziale deve essere sottoposto a cast all'interfaccia IMixedRealityDataProviderAccess
per accedere tramite le GetDataProvider<T>
API, che possono quindi essere usate per accedere direttamente agli oggetti Observer mesh in fase di esecuzione.
// 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>();
L'helper CoreServices.GetSpatialAwarenessSystemDataProvider<T>()
semplifica questo modello di accesso, come illustrato di seguito.
// 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);
Avvio e arresto dell'osservazione mesh
Una delle attività più comuni durante la gestione del sistema di consapevolezza spaziale disattiva/attiva in modo dinamico la funzionalità. Questa operazione viene eseguita per Osservatore tramite le IMixedRealitySpatialAwarenessObserver.Resume
API e 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();
Questa funzionalità di codice può essere semplificata anche tramite l'accesso tramite il sistema di consapevolezza spaziale direttamente.
var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);
Avvio e arresto di tutte le osservazioni mesh
In genere, è utile avviare/arrestare tutte le osservazioni mesh nell'applicazione. Ciò può essere ottenuto tramite le API ResumeObservers()
del sistema di consapevolezza spaziale utili e SuspendObservers()
.
// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();
// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();
Enumerazione e accesso alle mesh
L'accesso alle mesh può essere eseguito per Osservatore e quindi enumerazione tramite le mesh note a tale Osservatore mesh tramite l'API IMixedRealitySpatialAwarenessMeshObserver
.
Se in esecuzione nell'editor, è possibile usare l'oggetto AssetDatabase.CreateAsset()
per salvare l'oggetto Mesh
in un file di asset.
Se in esecuzione nel dispositivo, sono disponibili molti plug-in community e archivia per serializzare i MeshFilter
dati in un tipo di file modello.
// 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
}
Visualizzazione e nascondere la mesh spaziale
È possibile nascondere/mostrare mesh a livello di codice usando il codice di esempio seguente:
// 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;
Registrazione per gli eventi di osservazione mesh
I componenti possono implementare e IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>
quindi registrare con il sistema Di consapevolezza spaziale per ricevere eventi di osservazione mesh.
Lo DemoSpatialMeshHandler
script (Assets/MRTK/Examples/Demos/SpatialAwareness/Script) è un esempio utile e punto di partenza per l'ascolto degli eventi di Mesh Observer.
Questo è un esempio semplificato di script DemoSpatialMeshHandler e l'ascolto dell'evento di osservazione mesh.
// 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
}
}