Создание поставщика данных системы пространственной осведомленности — MRTK2

Система пространственной осведомленности — это расширяемая система для предоставления приложениям данных о реальных средах. Чтобы добавить поддержку новой аппаратной платформы или новой формы данных пространственной осведомленности, может потребоваться пользовательский поставщик данных.

В этой статье описывается создание пользовательских поставщиков данных, также называемых пространственными наблюдателями, для системы пространственной осведомленности. Показан пример кода из SpatialObjectMeshObserver реализации класса, который полезен для загрузки данных трехмерной сетки в редакторе.

Примечание

Полный исходный код, используемый в этом примере, можно найти в папке Assets/MRTK/Providers/ObjectMeshObserver .

Структура пространства имен и папок

Поставщики данных могут распространяться одним из двух способов:

  1. Сторонние надстройки
  2. Часть Microsoft Смешанная реальность Toolkit

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

Сторонняя надстройка

Пространство имен

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

  • Название компании, создающей надстройку
  • Область применения компонента

Например, поставщик данных пространственной осведомленности, созданный и поставляемый компанией Contoso, может быть "Contoso.MixedReality.Toolkit.SpatialAwareness".

Структура папок

Рекомендуется, чтобы исходный код для поставщиков данных был размещен в иерархии папок, как показано на следующем рисунке.

Пример структуры папок

Если папка ContosoSpatialAwareness содержит реализацию поставщика данных, папка Editor содержит инспектор (и любой другой код, зависящий от редактора Unity), а папка Profiles содержит один или несколько готовых объектов с возможностью создания скриптов профиля.

Отправка MRTK

Пространство имен

Если поставщик данных системы пространственной осведомленности отправляется в репозиторий Смешанная реальность Toolkit, пространство имен должно начинаться с Microsoft.MixedReality.Toolkit (например, Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver).

и код должен находиться в папке под MRTK/Providers (например, MRTK/Providers/ObjectMeshObserver).

Структура папок

Весь код должен находиться в папке под MRTK/Providers (например, MRTK/Providers/ObjectMeshObserver).

Определение объекта пространственных данных

Первым шагом при создании поставщика данных пространственной осведомленности является определение типа данных (например, сетки или плоскости), которые он будет предоставлять приложениям.

Все объекты пространственных данных должны реализовывать IMixedRealitySpatialAwarenessObject интерфейс .

Смешанная реальность Toolkit Foundation предоставляет следующие пространственные объекты, которые можно использовать или расширить в новых поставщиках данных.

Реализация поставщика данных

Указание наследования интерфейса и (или) базового класса

Все поставщики данных о пространственной IMixedRealitySpatialAwarenessObserver осведомленности должны реализовать интерфейс , который определяет минимальные функциональные возможности, необходимые для системы пространственной осведомленности. В основу MRTK входит BaseSpatialObserver класс , который предоставляет реализацию этой необходимой функции по умолчанию.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Примечание

Интерфейс IMixedRealityCapabilityCheck используется классом SpatialObjectMeshObserver , чтобы указать, что он обеспечивает поддержку возможности SpatialAwarenessMesh.

Применение атрибута MixedRealityDataProvider

Ключевым шагом при создании поставщика данных Spatial Awareness является применение атрибута MixedRealityDataProvider к классу . Этот шаг позволяет задать профиль и платформы по умолчанию для поставщика данных при выборе в профиле пространственной осведомленности, а также имя, путь к папке и многое другое.

[MixedRealityDataProvider(
    typeof(IMixedRealitySpatialAwarenessSystem),
    SupportedPlatforms.WindowsEditor | SupportedPlatforms.MacEditor | SupportedPlatforms.LinuxEditor,
    "Spatial Object Mesh Observer",
    "ObjectMeshObserver/Profiles/DefaultObjectMeshObserverProfile.asset",
    "MixedRealityToolkit.Providers")]
public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Реализация методов IMixedRealityDataProvider

После определения класса следующим шагом является предоставление реализации IMixedRealityDataProvider интерфейса.

Примечание

Класс BaseSpatialObserver с помощью BaseService класса предоставляет только пустые реализации для IMixedRealityDataProvider методов. Сведения об этих методах обычно зависят от поставщика данных.

Поставщик данных должен реализовать следующие методы:

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

Реализация логики поставщика данных

Следующим шагом является добавление логики поставщика данных путем реализации конкретного интерфейса поставщика данных, например IMixedRealitySpatialAwarenessMeshObserver. Эта часть поставщика данных обычно зависит от платформы.

Уведомления об изменениях наблюдения

Чтобы разрешить приложениям реагировать на изменения в понимании устройства среды, поставщик данных вызывает события уведомлений, как определено в интерфейсе IMixedRealitySpatialAwarenessObservationtHandler<T> .

  • OnObservationAdded()
  • OnObservationRemoved()
  • OnObservationUpdated()

Следующий код из SpatialObjectMeshObserver примеров демонстрирует возникновение и событие при добавлении данных сетки.

// The data to be sent when mesh observation events occur.
// This member variable is initialized as part of the Initialize() method.
private MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> meshEventData = null;

/// <summary>
/// Sends the observations using the mesh data contained within the configured 3D model.
/// </summary>
private void SendMeshObjects()
{
    if (!sendObservations) { return; }

    if (spatialMeshObject != null)
    {
        MeshFilter[] meshFilters = spatialMeshObject.GetComponentsInChildren<MeshFilter>();
        for (int i = 0; i < meshFilters.Length; i++)
        {
            SpatialAwarenessMeshObject meshObject = SpatialAwarenessMeshObject.Create(
                meshFilters[i].sharedMesh,
                MeshPhysicsLayer,
                $"Spatial Object Mesh {currentMeshId}",
                currentMeshId,
                ObservedObjectParent);

            meshObject.GameObject.transform.localPosition = meshFilters[i].transform.position;
            meshObject.GameObject.transform.localRotation = meshFilters[i].transform.rotation;

            ApplyMeshMaterial(meshObject);

            meshes.Add(currentMeshId, meshObject);

            // Initialize the meshEventData variable with data for the added event.
            meshEventData.Initialize(this, currentMeshId, meshObject);
            // Raise the event via the spatial awareness system.
            SpatialAwarenessSystem?.HandleEvent(meshEventData, OnMeshAdded);

            currentMeshId++;
        }
    }

    sendObservations = false;
}

Примечание

Класс SpatialObjectMeshObserver не вызывает OnObservationUpdated событий, так как трехмерная модель загружается только один раз. Реализация в WindowsMixedRealitySpatialMeshObserver классе предоставляет пример создания OnObservationUpdated события для наблюдаемой сетки.

Добавление инструментирования Unity Profiler

Производительность критически важна в приложениях смешанной реальности. Каждый компонент добавляет некоторые издержки, которые должны учитывать приложения. Для этого важно, чтобы все поставщики данных о пространственной осведомленности содержали инструментирование Unity Profiler во внутреннем цикле и часто используемые пути кода.

Рекомендуется реализовать шаблон, используемый MRTK при инструментировании пользовательских поставщиков.

        private static readonly ProfilerMarker UpdateObserverPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealitySpatialMeshObserver.UpdateObserver");

        /// <summary>
        /// Requests updates from the surface observer.
        /// </summary>
        private void UpdateObserver()
        {
            using (UpdateObserverPerfMarker.Auto())
            {
                // Code to be measured.
            }
        }

Примечание

Имя, используемое для идентификации маркера профилировщика, является произвольным. MRTK использует следующий шаблон.

"[product] className.methodName — необязательное примечание"

Рекомендуется, чтобы пользовательские поставщики данных следовали аналогичному шаблону, чтобы упростить идентификацию конкретных компонентов и методов при анализе трассировок.

Создание профиля и инспектора

В Смешанная реальность Toolkit поставщики данных настраиваются с помощью профилей.

Определение профиля

Содержимое профиля должно зеркало доступные свойства поставщика данных (например, интервал обновления). Все настраиваемые пользователем свойства, определенные в каждом интерфейсе, должны содержаться в профиле.

Базовые классы рекомендуется использовать, если новый поставщик данных расширяет существующий поставщик. Например, SpatialObjectMeshObserverProfile расширяет MixedRealitySpatialAwarenessMeshObserverProfile , чтобы позволить клиентам предоставлять трехмерную модель для использования в качестве данных среды.

[CreateAssetMenu(
    menuName = "Mixed Reality Toolkit/Profiles/Spatial Object Mesh Observer Profile",
    fileName = "SpatialObjectMeshObserverProfile",
    order = 100)]
public class SpatialObjectMeshObserverProfile : MixedRealitySpatialAwarenessMeshObserverProfile
{
    [SerializeField]
    [Tooltip("The model containing the desired mesh data.")]
    private GameObject spatialMeshObject = null;

    /// <summary>
    /// The model containing the desired mesh data.
    /// </summary>
    public GameObject SpatialMeshObject => spatialMeshObject;
}

Атрибут CreateAssetMenu можно применить к классу профиля, чтобы клиенты могли создавать экземпляр профиля с помощью меню Создание>ресурсов>Смешанная реальность профилей набора средств>.

Реализация инспектора

Инспекторы профилей — это пользовательский интерфейс для настройки и просмотра содержимого профиля. Каждый инспектор профилей BaseMixedRealityToolkitConfigurationProfileInspector должен расширять класс .

Атрибут CustomEditor сообщает Unity о типе ресурса, к которому применяется инспектор.

[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

Создание определений сборок

Смешанная реальность Toolkit использует файлы определения сборки (ASMDEF) для указания зависимостей между компонентами, а также для сокращения времени компиляции в Unity.

Рекомендуется создавать файлы определения сборки для всех поставщиков данных и их компонентов редактора.

Используя структуру папок в предыдущем примере, для поставщика данных ContosoSpatialAwareness будет два ASMDEF-файла.

Первое определение сборки предназначено для поставщика данных. В этом примере он будет называться ContosoSpatialAwareness и будет находиться в папке ContosoSpatialAwareness примера. Это определение сборки должно указывать зависимость от Microsoft.MixedReality.Toolkit и любых других сборок, от которых оно зависит.

Определение сборки ContosoInputEditor указывает инспектор профилей и любой код редактора. Этот файл должен находиться в корневой папке кода редактора. В этом примере файл будет расположен в папке ContosoSpatialAwareness\Editor . Это определение сборки будет содержать ссылку на сборку ContosoSpatialAwareness, а также:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspectors
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

Регистрация поставщика данных

После создания поставщика данных можно зарегистрировать в системе пространственной осведомленности для использования в приложении.

Выбор наблюдателя сетки пространственных объектов

Упаковка и распространение

Поставщики данных, распространяемые как сторонние компоненты, имеют конкретные сведения об упаковке и распространении, оставленные на выбор разработчика. Скорее всего, наиболее распространенным решением будет создание пакета unitypackage и распространение через хранилище активов Unity.

Если поставщик данных отправляется и принимается как часть пакета Microsoft Смешанная реальность Toolkit, команда Microsoft MRTK упаковает и распространяет его в рамках предложений MRTK.

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