Konfigurera nätobservatörer via kod – MRTK2
I den här artikeln beskrivs några av de viktigaste mekanismerna och API:erna för att programmatiskt konfigurera Spatial Awareness-systemet och relaterade Mesh Observer-dataproviders .
Åtkomst till nätobservatörer
Mesh Observer-klasser som implementerar IMixedRealitySpatialAwarenessMeshObserver
gränssnittet tillhandahåller plattformsspecifika nätdata till systemet för rumslig medvetenhet. Flera observatörer kan konfigureras i Spatial Awareness-profilen.
Åtkomst till dataleverantörerna i Spatial Awareness-systemet är oftast detsamma som för andra Mixed Reality Toolkit-tjänsten. Tjänsten Spatial Awareness måste skickas till IMixedRealityDataProviderAccess
gränssnittet för åtkomst via API:erna GetDataProvider<T>
, som sedan kan användas för att komma åt Mesh Observer-objekt direkt vid körning.
// 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>();
Hjälpverktyget CoreServices.GetSpatialAwarenessSystemDataProvider<T>()
förenklar det här åtkomstmönstret enligt nedan.
// 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);
Starta och stoppa nätobservation
En av de vanligaste uppgifterna när du hanterar Spatial Awareness-systemet är att stänga av/aktivera funktionen dynamiskt vid körning. Detta görs per övervakare via API:erna IMixedRealitySpatialAwarenessObserver.Resume
och 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();
Den här kodfunktionen kan också förenklas via åtkomst via Spatial Awareness-systemet direkt.
var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);
Starta och stoppa all nätobservation
Det är vanligtvis praktiskt att starta/stoppa all nätobservation i programmet. Detta kan uppnås genom hjälpsamma SPATIAL Awareness system API:er, ResumeObservers()
och SuspendObservers()
.
// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();
// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();
Räkna upp och komma åt näten
Åtkomst till näten kan göras per observatör och sedan räknas upp genom de nät som mesh-observatören känner till via API:et IMixedRealitySpatialAwarenessMeshObserver
.
Om du kör i redigeraren kan du använda AssetDatabase.CreateAsset()
för att spara objektet i Mesh
en tillgångsfil.
Om du kör på enheten finns det många community- och store-plugin-program som är tillgängliga för att serialisera MeshFilter
data till en modellfiltyp.
// 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
}
Visa och dölja det rumsliga nätet
Det går att programmatiskt dölja/visa nät med hjälp av exempelkoden nedan:
// 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;
Registrera för mesh-observationshändelser
Komponenter kan implementera IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>
och sedan registrera med Spatial Awareness-systemet för att ta emot Mesh Observation-händelser.
Skriptet DemoSpatialMeshHandler
(Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) är ett användbart exempel och utgångspunkt för att lyssna på Mesh Observer-händelser.
Det här är ett förenklat exempel på DemoSpatialMeshHandler-skript och Mesh Observation-händelselyssning.
// 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
}
}