Konfigurowanie obserwatorów siatki za pomocą kodu — MRTK2
W tym artykule omówiono niektóre kluczowe mechanizmy i interfejsy API w celu programowego konfigurowania systemu rozpoznawania przestrzennego i powiązanych dostawców danych obserwatora usługi Mesh .
Uzyskiwanie dostępu do obserwatorów siatki
Klasy obserwatorów usługi Mesh, które implementują IMixedRealitySpatialAwarenessMeshObserver
interfejs, zapewniają dane siatki specyficzne dla platformy do systemu rozpoznawania przestrzennego. W profilu świadomości przestrzennej można skonfigurować wiele obserwatorów.
Uzyskiwanie dostępu do dostawców danych systemu rozpoznawania przestrzennego jest w większości takie samo jak w przypadku każdej innej usługi Mixed Reality Toolkit. Usługa Rozpoznawanie przestrzenne musi być rzutowana do interfejsu w IMixedRealityDataProviderAccess
celu uzyskania dostępu za pośrednictwem GetDataProvider<T>
interfejsów API, które następnie można wykorzystać do uzyskiwania dostępu do obiektów obserwatora usługi Mesh bezpośrednio w czasie wykonywania.
// 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>();
Pomocnik CoreServices.GetSpatialAwarenessSystemDataProvider<T>()
upraszcza ten wzorzec dostępu, jak pokazano poniżej.
// 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);
Rozpoczynanie i zatrzymywanie obserwacji siatki
Jednym z najbardziej typowych zadań podczas pracy z systemem rozpoznawania przestrzennego jest dynamiczne wyłączanie/włączanie funkcji w czasie wykonywania. Odbywa się to dla obserwatora IMixedRealitySpatialAwarenessObserver.Resume
za pośrednictwem interfejsów API i 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();
Tę funkcję kodu można również uprościć za pośrednictwem dostępu bezpośrednio za pośrednictwem systemu rozpoznawania przestrzennego.
var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);
Uruchamianie i zatrzymywanie wszystkich obserwacji siatki
Zazwyczaj wygodne jest uruchamianie/zatrzymywanie wszystkich obserwacji siatki w aplikacji. Można to osiągnąć za pomocą przydatnych interfejsów ResumeObservers()
API systemu rozpoznawania przestrzennego i SuspendObservers()
.
// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();
// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();
Wyliczanie i uzyskiwanie dostępu do siatki
Dostęp do siatki można wykonać dla obserwatora, a następnie wyliczać za pośrednictwem siatki znanych obserwatorowi usługi Mesh za pośrednictwem interfejsu IMixedRealitySpatialAwarenessMeshObserver
API.
W przypadku uruchamiania w edytorze można użyć polecenia AssetDatabase.CreateAsset()
, aby zapisać Mesh
obiekt w pliku zasobu.
W przypadku uruchamiania na urządzeniu istnieje wiele wtyczek społeczności i sklepów, które umożliwiają serializowanie MeshFilter
danych w typie pliku modelu.
// 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
}
Pokazywanie i ukrywanie siatki przestrzennej
Można programowo ukryć/pokazać siatki przy użyciu poniższego przykładowego kodu:
// 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;
Rejestrowanie na potrzeby zdarzeń obserwacji siatki
Składniki mogą zaimplementować element IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>
, a następnie zarejestrować się w systemie rozpoznawania przestrzennego w celu odbierania zdarzeń obserwacji siatki.
Skrypt DemoSpatialMeshHandler
(Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) jest przydatnym przykładem i punktem wyjścia do nasłuchiwania zdarzeń obserwatora usługi Mesh.
Jest to uproszczony przykład skryptu DemoSpatialMeshHandler i nasłuchiwania zdarzeń obserwacji usługi 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
}
}