Когда вы носите гарнитуру смешанной реальности, она становится центром вашего голографического мира. Компонент Unity Camera будет автоматически обрабатывать стереоскопическую отрисовку и следить за движением и поворотом головы. Однако для полной оптимизации визуального качества и стабильности голограмм необходимо задать параметры камеры, описанные ниже.
Иммерсивные гарнитуры HoloLens vs VR
Параметры по умолчанию в компоненте камеры Unity предназначены для традиционных трехмерных приложений, которым нужен фон, похожий на скайбокс, так как они не имеют реального мира.
При выполнении на иммерсивной гарнитуре вы отрисовываете все, что видит пользователь, поэтому вам, скорее всего, потребуется сохранить skybox.
Однако при работе на голографической гарнитуре , такой как HoloLens, реальный мир должен отображаться за всем, что отрисовывает камера. Задайте для фона камеры прозрачный (в HoloLens черный цвет отображается как прозрачный) вместо текстуры Skybox:
Выбор основной камеры на панели Иерархия
На панели Инспектор найдите компонент "Камера" и измените раскрывающийся список "Очистить флаги" с "Skybox" на "Сплошной цвет".
Выберите средство выбора цвета фона и измените значения RGBA на (0, 0, 0, 0).
При настройке из кода можно использовать Unity Color.clear
Пространство имен:Microsoft.MixedReality.Toolkit.CameraSystem Тип:MixedRealityCameraSystem
Чтобы проверить непрозрачность камеры, система MixedRealityCamera имеет IsOpaque свойство .
CoreServices.CameraSystem.IsOpaque;
Пространство имен:UnityEngine.XR Type:XRDisplaySubsystem
Вы можете использовать код скрипта, чтобы определить во время выполнения, является ли гарнитура иммерсивной или голографической, проверив displayOpaque в активно работающей системе XRDisplaySubsystem.
Пространство имен:UnityEngine.XR.WSA Тип:HolographicSettings
Независимо от того, какой вид опыта вы разрабатываете, основная камера всегда является основным компонентом стерео отрисовки, подключенным к монитору вашего устройства. Будет проще разместить приложение, если представить себе начальную позицию пользователя как (X: 0, Y: 0, Z: 0). Так как основная камера отслеживает движение головы пользователя, начальную позицию пользователя можно задать, задав начальную позицию основной камеры.
Основной выбор заключается в том, что вы разрабатываете для HoloLens или виртуальной реальности иммерсивные гарнитуры. Как только вы получите это, перейдите к разделу настройки.
Настройка камеры HoloLens
Для приложений HoloLens необходимо использовать привязки для любых объектов, которые нужно заблокировать в среде сцены. Мы рекомендуем использовать неограниченное пространство, чтобы обеспечить максимальную стабильность и создать привязки в нескольких помещениях.
Следуйте инструкциям из этого пошагового руководства, чтобы добавить и автоматически настроить Смешанная реальность Toolkit в проекте Unity. Кроме того, можно работать непосредственно с классом MixedRealityPlayspace из MRTK для Unity и задать для целевого масштабазначение World:
MRTK должен автоматически обрабатывать положение игрового пространства и камеры, но это хорошо для двойной проверки:
На панели Иерархия разверните GameObject MixedRealityPlayspace и найдите дочерний объект Main Camera .
На панели Инспектор найдите компонент Преобразование и измените положение на (X: 0, Y: 0, Z: 0)
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Device);
xrInputSubsystem.TrySetTrackingOriginMode(TrackingOriginModeFlags.Unbounded); // Recommendation for OpenXR
Вы можете использовать ARSession для приложений HoloLens, которые лучше работают с привязками и ARKit/ARCore.
Важно!
Для сеанса дополненной реальности и связанных функций требуется установить AR Foundation.
Кроме того, изменения камеры можно применить вручную без использования ARSession:
Выбор основной камеры на панели Иерархия
На панели Инспектор найдите компонент Преобразование и измените положение на (X: 0, Y: 0, Z: 0)
Камера в области инспектора в Unity
Добавление TrackedPoseDriver в основную камеру
Выбор основной камеры на панели Иерархия
На панели Инспектор найдите компонент Преобразование и измените положение на (X: 0, Y: 0, Z: 0)
Камера в области инспектора в Unity
Перейдите в раздел Другие параметрыпараметров проигрывателя Магазина Windows.
Выберите Windows Mixed Reality в качестве устройства, которое может быть указано как Windows Holographic в более старых версиях Unity.
Выбор виртуальной реальности поддерживается
Так как объект Main Camera автоматически помечается как камера, Unity обеспечивает все движение и перевод.
Примечание
Эти параметры необходимо применить к камере в каждой сцене приложения.
По умолчанию при создании новой сцены в Unity она будет содержать gameObject main Camera в иерархии, который включает компонент "Камера", но параметры могут не применяться должным образом.
Настройка виртуальной камеры
Windows Mixed Reality поддерживает приложения в широком диапазоне возможностей, от приложений с ориентацией и с размещением до приложений для масштабирования помещений. В HoloLens вы можете идти дальше и создавать приложения мирового масштаба, которые позволяют пользователям ходить за пределы 5 метров, исследуя весь этаж здания и за его пределами.
Первым шагом в создании смешанной реальности в Unity является определение масштабируемости приложения:
Если вы создаете для HL2, мы рекомендуем создать интерфейс на уровне глаз или рассмотреть возможность использования распознавания сцены , чтобы обдумать пол сцены.
Перейдите в раздел Другие параметрыпараметров проигрывателя Магазина Windows.
Выберите Windows Mixed Reality в качестве устройства, которое может быть указано как Windows Holographic в более старых версиях Unity.
Выбор виртуальной реальности поддерживается
Так как объект Main Camera автоматически помечается как камера, Unity обеспечивает все движение и перевод.
Примечание
Эти параметры необходимо применить к камере в каждой сцене приложения.
По умолчанию при создании новой сцены в Unity она будет содержать gameObect Main Camera в иерархии, который включает компонент "Камера", но не имеет параметров, указанных ниже.
Пространство имен:UnityEngine.XR Тип:XRDevice
Для работы в режиме постоянного или комнатного масштабирования необходимо разместить содержимое относительно пола. Для определения пола пользователя используется пространственный этап, который представляет определенный пользователем источник уровня пола и необязательную границу комнаты, настроенную во время первого запуска.
Чтобы убедиться, что Unity работает с мировой системой координат на уровне пола, можно задать и проверить, использует ли Unity тип пространства отслеживания RoomScale:
if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
// RoomScale mode was set successfully. App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
// RoomScale mode was not set successfully. App cannot make assumptions about where the floor plane is.
}
Если SetTrackingSpaceType возвращает значение true, Unity успешно переключила свою систему координат мира для отслеживания сценической системы отсчета.
Если SetTrackingSpaceType возвращает значение false, Unity не удалось переключиться на промежуточную систему отсчета, скорее всего, из-за того, что пользователь не настроил пол в своей среде. Хотя ложное возвращаемое значение не является общим, это может произойти, если этап настроен в другой комнате и устройство перемещено в текущую комнату без настройки пользователем нового этапа.
Когда приложение успешно задаст тип пространства для отслеживания RoomScale, содержимое, размещенное в плоскости y=0, будет отображаться на полу. Источником в 0, 0, 0 будет конкретное место на полу, где пользователь стоял во время настройки комнаты, а -Z представляет направление вперед, к которому он столкнулся во время установки.
Перейдите в раздел Другие параметрыпараметров проигрывателя Магазина Windows.
Выберите Windows Mixed Reality в качестве устройства, которое может быть указано как Windows Holographic в более старых версиях Unity.
Выбор виртуальной реальности поддерживается
Так как объект Main Camera автоматически помечается как камера, Unity обеспечивает все движение и перевод.
Примечание
Эти параметры необходимо применить к камере в каждой сцене приложения.
По умолчанию при создании новой сцены в Unity она будет содержать gameObect Main Camera в иерархии, который включает компонент "Камера", но не имеет параметров, указанных ниже.
Пространство имен:UnityEngine.XR Тип:XRDevice
Чтобы создать интерфейс только для ориентации или сидячих мест, необходимо задать для Unity тип пространства для отслеживания стационарных данных. Неподвижное пространство отслеживания задает мировую систему координат Unity для отслеживания неподвижной системы отсчета. В режиме стационарного отслеживания содержимое, размещенное в редакторе непосредственно перед расположением камеры по умолчанию (вперед — -Z), будет отображаться перед пользователем при запуске приложения.
Пространство имен:UnityEngine.XR Тип:InputTracking
Для чистой ориентации, например 360-градусного видеозрителя (где обновления позиционной головы разрушают иллюзию), можно установить XR. InputTracking.disablePositionalTracking до true:
InputTracking.disablePositionalTracking = true;
Для масштабирования с помощью сидячего места можно вызвать XR, чтобы позволить пользователю позже переначертить источник места. Метод InputTracking.Recenter :
Если вы используете MRTK, фон камеры автоматически настраивается и управляется. Для пакетов SDK XR или устаревших проектов WSA рекомендуется настроить фон камеры на сплошной черный цвет на HoloLens и сохранить skybox для виртуальной реальности.
Использование нескольких камер
Если в сцене есть несколько компонентов камеры, Unity знает, какую камеру использовать для стереоскопической отрисовки на основе того, какой GameObject имеет тег MainCamera. В устаревшей версии XR этот тег также используется для синхронизации отслеживания головы. В пакете SDK для XR отслеживание головы осуществляется с помощью скрипта TrackedPoseDriver, подключенного к камере.
Общий доступ к буферам глубины
Совместное использование буфера глубины приложения в Windows с каждым кадром обеспечит одно из двух повышений стабильности голограммы в зависимости от типа гарнитуры, для которых выполняется отрисовка:
Иммерсивные гарнитуры виртуальной реальности могут выполнять позиционные перепроецирования при предоставлении буфера глубины, корректируя голограммы для неправильного прогнозирования как положения, так и ориентации.
Гарнитуры HoloLens имеют несколько различных методов. HoloLens 1 автоматически выбирает точку фокусировки при предоставлении буфера глубины, оптимизируя стабильность голограммы вдоль плоскости, которая пересекает больше всего содержимого. HoloLens 2 стабилизирует содержимое с помощью LSR глубины (см. примечания).
Диалоговое окно конфигурации MRTK попытается задать параметры буфера глубины как для пакета SDK XR, так и для устаревшей версии WSA, но рекомендуется проверить эти вкладки и проверить параметры в Unity.
Чтобы задать, будет ли приложение Unity предоставлять буфер глубины для Windows, выполните следующие действия.
Перейдите в раздел EditProject SettingsXR Plug-in Management (Управление> подключаемыми модулями > XR) и убедитесь, что пункт меню развернут.
Щелкните пункт меню, соответствующий выбранной среде выполнения XR, Windows Mixed Reality или OpenXR. Кроме того, убедитесь, что выбрана правильная платформа сборки, так как доступны вкладки для автономной и универсальная платформа Windows Windows.
Чтобы включить и настроить, выполните следующие действия.
Для OpenXR выберите формат глубины или "Нет" в раскрывающемся списке Режим отправки глубины .
Для Windows Mixed Reality установите или снимите флажок Общий буфер глубины. Затем выберите формат в раскрывающемся списке Формат буфера глубины .
Примечание
Обычно рекомендуется использовать 16-разрядные буферы глубины для повышения производительности. Однако при использовании 16-разрядного формата глубины необходимые эффекты буфера трафарета (например, некоторые панели прокрутки пользовательского интерфейса Unity) не будут работать, так как Unity не создает буфер трафарета в этом параметре. Выбор 24-разрядного формата глубины , как правило, создает 8-разрядный буфер трафарета , если это применимо на графической платформе конечной точки.
Чтобы задать, будет ли приложение Unity предоставлять буфер глубины для Windows, выполните следующие действия.
Перейдите в раздел Изменение>параметров> проектаПроигрыватель>универсальная платформа Windows вкладку>XR Settings (Параметры XR).
Разверните элемент пакета SDK для Windows Mixed Reality.
Установите или снимите флажок Включить общий доступ к буферу глубины . Параметр Включить общий доступ к буферу глубины установлен по умолчанию в новых проектах, но может быть снят по умолчанию в старых проектах.
Буфер глубины может улучшить визуальное качество, если Windows может точно сопоставить нормализованные значения глубины в пикселях в буфере глубины с расстояниями в метрах с помощью ближней и дальней плоскостей, заданных в Unity на основной камере. Если отрисовка передает значения глубины обработки обычным способом, в этом случае все в порядке, хотя полупрозрачные проходы отрисовки, которые записываются в буфер глубины при отображении в существующих цветовых пикселях, могут запутать повторную прорисовку. Если вы знаете, что проходы отрисовки оставят многие конечные пиксели глубины неточными значениями глубины, скорее всего, вы получите лучшее визуальное качество, сняв флажок "Включить общий доступ к буферу глубины".
Примечание
Обычно рекомендуется использовать 16-разрядные буферы глубины для повышения производительности. Однако при использовании 16-разрядного формата глубины необходимые эффекты буфера трафарета (например, некоторые панели прокрутки пользовательского интерфейса Unity) не будут работать, так как Unity не создает буфер трафарета в этом параметре. Выбор 24-разрядного формата глубины , как правило, создает 8-разрядный буфер трафарета , если это применимо на графической платформе конечной точки.
Использование обрезки плоскостей
Отображение содержимого, слишком близкого к пользователю, может быть неудобным в смешанной реальности. Вы можете настроить ближней и дальней плоскости клипа на компоненте Камера.
Выбор основной камеры на панели Иерархия
На панели Инспектор найдите компонент КамерыОбрезание плоскостей и измените текстовое поле Рядом с 0,3 на 0,85. Содержимое, отрисованное еще ближе, может привести к дискомфорту пользователя, и его следует избегать в соответствии с рекомендациями по расстоянию отрисовки.
MRTK предоставляет встроенную систему телепорта , которая автоматически работает между шарнирными руками и контроллерами.
Рекомендуется использовать реализацию телепортации MRTK.
Если вы решили не использовать MRTK, Unity предоставляет реализацию телепортации в XR Interaction Toolkit.
Если вы решили реализовать собственные, следует помнить, что вы не можете переместить камеру напрямую. Так как Unity управляет камерой для отслеживания головы, необходимо предоставить камере родителя в иерархии и переместить этот GameObject. Это эквивалент playspace MRTK.
Рекомендуется использовать реализацию телепортации MRTK.
Если вы решили реализовать собственные, следует помнить, что вы не можете переместить камеру напрямую. Так как Unity управляет камерой для отслеживания головы, необходимо предоставить камере родителя в иерархии и переместить этот GameObject. Это эквивалент playspace MRTK.
Режимы повторного проецирования
HoloLens и иммерсивные гарнитуры будут повторно проектировать каждый кадр, отображаемый приложением, чтобы настроить любое неправильное представление о фактическом положении головы пользователя при создании фотонов.
По умолчанию:
Иммерсивные гарнитуры виртуальной реальности будут выполнять позиционные перепроецирования, если приложение предоставляет буфер глубины для заданного кадра. Иммерсивные гарнитуры также корректируют голограммы для неправильного прогнозирования положения и ориентации. Если буфер глубины не указан, система исправит только неправильные представления в ориентации.
Голографические гарнитуры, такие как HoloLens 2, будут выполнять позиционный перепроецирование независимо от того, предоставляет ли приложение буфер глубины или нет. Позиционный перепроецирование возможно без буферов глубины на HoloLens, так как отрисовка часто разрежена со стабильным фоном, предоставляемым реальным миром.
Например, если вы создаете интерфейс только для ориентации с жестко заблокированным телом содержимого (например, видео с 360-градусным содержимым), можно явно задать режим повторного проецирования только на ориентацию, задав для него значение ReprojectionMode.OrientationOnly.
Например, если вы создаете интерфейс только для ориентации с жестко заблокированным текстом содержимого (например, видео с разрешением 360 градусов), можно явно задать режим повторного проецирования на ориентацию, задав для него значение HolographicReprojectionMode.OrientationOnly.
Следующий этап разработки
Если вы выполняете описанный нами путь разработки Unity, вы находитесь в разгар изучения основных стандартных блоков MRTK. Отсюда вы можете перейти к следующему стандартному блоку: