Создание поставщика данных системы пространственной осведомленности — MRTK2
Система пространственной осведомленности — это расширяемая система для предоставления приложениям данных о реальных средах. Чтобы добавить поддержку новой аппаратной платформы или новой формы данных пространственной осведомленности, может потребоваться пользовательский поставщик данных.
В этой статье описывается создание пользовательских поставщиков данных, также называемых пространственными наблюдателями, для системы пространственной осведомленности. Показан пример кода из SpatialObjectMeshObserver
реализации класса, который полезен для загрузки данных трехмерной сетки в редакторе.
Примечание
Полный исходный код, используемый в этом примере, можно найти в папке Assets/MRTK/Providers/ObjectMeshObserver
.
Структура пространства имен и папок
Поставщики данных могут распространяться одним из двух способов:
- Сторонние надстройки
- Часть 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.
См. также раздел
- Система отслеживания пространственного положения.
IMixedRealitySpatialAwarenessObject
Интерфейс- Класс
BaseSpatialAwarenessObject
- Класс
SpatialAwarenessMeshObject
- Класс
SpatialAwarenessPlanarObject
IMixedRealitySpatialAwarenessObserver
Интерфейс- Класс
BaseSpatialObserver
IMixedRealitySpatialAwarenessMeshObserver
ИнтерфейсIMixedRealityDataProvider
ИнтерфейсIMixedRealityCapabilityCheck
Интерфейс