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
    }
}

Zobacz też