Поделиться через


Настройка наблюдателей сетки с помощью кода — MRTK2

В этой статье рассматриваются некоторые ключевые механизмы и API для программной настройки системы пространственной осведомленности и связанных поставщиков данных Наблюдателя сетки .

Доступ к наблюдателям сетки

Классы Mesh Observer, реализующие IMixedRealitySpatialAwarenessMeshObserver интерфейс , предоставляют данные сетки для конкретной платформы в систему пространственной осведомленности. В профиле пространственной осведомленности можно настроить несколько наблюдателей.

Доступ к поставщикам данных системы пространственной осведомленности в основном выполняется так же, как и к любой другой службе Смешанная реальность Toolkit. Служба пространственной осведомленности должна быть приведена к IMixedRealityDataProviderAccess интерфейсу для доступа через GetDataProvider<T> API, которые затем можно использовать для доступа к объектам Mesh Observer непосредственно во время выполнения.

// 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>();

Помощник CoreServices.GetSpatialAwarenessSystemDataProvider<T>() упрощает этот шаблон доступа, как показано ниже.

// 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);

Запуск и остановка наблюдения за сеткой

Одной из наиболее распространенных задач при работе с системой пространственной осведомленности является динамическое отключение или включение функции во время выполнения. Это делается для каждого наблюдателя с помощью IMixedRealitySpatialAwarenessObserver.Resume API и 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();

Эту функцию кода также можно упростить за счет прямого доступа через систему пространственной осведомленности.

var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

Запуск и остановка всех наблюдений сетки

Обычно удобно запускать или останавливать все наблюдения за сеткой в приложении. Это можно сделать с помощью полезных API системы распознавания пространственного положения и ResumeObservers()SuspendObservers().

// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();

// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();

Перечисление сеток и доступ к ней

Доступ к сеткам можно осуществлять для каждого наблюдателя, а затем перечисление с помощью сеток, известных наблюдателю сетки IMixedRealitySpatialAwarenessMeshObserver , через API.

При запуске в редакторе AssetDatabase.CreateAsset() можно использовать для сохранения объекта в Mesh файл ресурса.

При работе на устройстве существует множество подключаемых модулей сообщества и хранилищ для сериализации MeshFilter данных в тип файла модели.

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

Отображение и скрытие пространственной сетки

С помощью приведенного ниже примера кода можно скрыть или отобразить сетки программным способом:

// 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;

Регистрация для событий наблюдения сетки

Компоненты могут реализовать IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> , а затем зарегистрировать в системе пространственной осведомленности для получения событий наблюдения сетки.

Скрипт DemoSpatialMeshHandler (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) является полезным примером и отправной точкой для прослушивания событий наблюдателя сетки.

Это упрощенный пример прослушивания скрипта DemoSpatialMeshHandler и события наблюдения сетки.

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

См. также раздел