Стабилизация голограммы — MRTK2

Производительность

Чтобы базовая платформа смешанной реальности и устройство добились наилучших результатов, важно достичь скорости кадров. Целевая частота кадров (например, 60 кадров/с или 90 кадров/с) будет отличаться на разных платформах и устройствах. Однако приложения смешанной реальности, отвечающие частоте кадров, будут иметь стабильные голограммы, а также эффективное отслеживание головы, отслеживание рук и многое другое.

Отслеживание среды

Стабильная голографическая отрисовка в значительной степени зависит от отслеживания положения головы с помощью платформы & устройства. Unity отрисовывает сцену каждый кадр из положения камеры, который оценивается и предоставляется базовой платформой. Если это отслеживание не соответствует фактическому перемещению головы, голограммы будут визуально неточными. Это особенно очевидно и важно для устройств дополненной реальности, таких как HoloLens, где пользователи могут связывать виртуальные голограммы с реальным миром. Производительность важна для надежного отслеживания головы, но могут быть и другие важные функции. Типы элементов среды, влияющие на взаимодействие с пользователем, будут зависеть от особенностей целевой платформы.

Windows Mixed Reality

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

Общий доступ к буферу глубины

Разработчики Unity могут совместно использовать буфер глубины приложения с платформой. Это предоставляет сведения о том, где существуют голограммы для текущего кадра, которые платформа может использовать для стабилизации голограмм с помощью аппаратного процесса, известного как Late-Stage репроецирование.

Репроектирование на поздних стадиях

В конце отрисовки кадра платформа Windows Mixed Reality принимает цвет & целевые объекты отрисовки глубины, созданные приложением, и преобразует окончательные выходные данные экрана с учетом небольшого движения головы с момента последнего прогнозирования положения головы. Выполнение игрового цикла приложения занимает время. Например, при 60 кадров/с это означает, что приложение принимает около 16,667 мс для отрисовки кадра. Несмотря на то, что это может показаться минимизируемым количеством времени, положение и ориентация головы пользователя изменится, в результате чего будут новые матрицы проекции для камеры в рендеринге. На поздних этапах перепроецирование преобразует пиксели на конечном изображении с учетом этой новой перспективы.

По пикселям и плоскости стабилизации LSR

В зависимости от конечной точки устройства и версии ОС, работающей на Windows Mixed Reality устройстве, алгоритм Late-Stage репроектирования будет выполняться в пикселях или через плоскость стабилизации.

На основе глубины пикселя

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

Плоскость стабилизации

Если невозможно создать точный буфер глубины для совместного использования с платформой, другая форма LSR использует плоскость стабилизации. Все голограммы в сцене получат некоторую стабилизацию, но голограммы, расположенные в нужной плоскости, получат максимальную аппаратную стабилизацию. Точка и норма для плоскости можно предоставить платформе через API HolographicSettings.SetFocusPointForFrame, предоставляемый Unity.

Формат буфера глубины

Если вы используете HoloLens для разработки, настоятельно рекомендуется использовать 16-разрядный формат буфера глубины по сравнению с 24-разрядным. Это может значительно сэкономить на производительности, хотя значения глубины будут иметь меньшую точность. Чтобы компенсировать меньшую точность и избежать Z-боя, рекомендуется уменьшить дальнюю плоскость клипа от значения по умолчанию 1000 м, установленного Unity.

Примечание

При использовании 16-разрядного формата глубины необходимые эффекты буфера трафарета не будут работать, так как Unity не создает буфер трафарета в этом параметре. При обратном выборе 24-разрядного формата глубины обычно создается 8-разрядный буфер трафарета, если это применимо на графической платформе конечной точки.

Общий доступ к буферу глубины в Unity

Чтобы использовать LSR на основе глубины, разработчики должны выполнить два важных шага.

  1. В разделе Изменение>параметров> проектаПроигрыватель>XR Параметры>Виртуальной реальности Пакеты> SDK для виртуальной реальности включить общий доступ к буферу глубины
    1. Если вы используете HoloLens, рекомендуется также выбрать 16-разрядный формат глубины .
  2. При отрисовке цвета на экране глубина отрисовки также

Непрозрачные объекты GameObject в Unity обычно записываются в глубину автоматически. Однако прозрачные & текстовые объекты обычно не записываются в глубину по умолчанию. При использовании стандартного шейдера MRTK или текстовой сетки Pro это можно легко исправить.

Примечание

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

Прозрачный стандартный шейдер MRTK

Для прозрачных материалов, использующих стандартный шейдер MRTK, выберите материал, чтобы просмотреть его в окне Инспектор . Затем нажмите кнопку Исправить сейчас , чтобы преобразовать материал для записи в глубину (т. е. Z-Write On).

До

Буфер глубины перед исправлением стандартного шейдера MRTK

После

Буфер глубины: фиксированный стандартный шейдер MRTK

Text Mesh Pro

Для объектов Text Mesh Pro выберите объект TMP GameObject, чтобы просмотреть его в инспекторе. В компоненте материала переключите шейдер для назначенного материала, чтобы использовать шейдер TEXTMeshPro MRTK.

Исправление буфера глубины Text Mesh Pro

Пользовательский шейдер

При написании пользовательского шейдера добавьте флаг ZWrite в верхнюю часть определения блока Pass , чтобы настроить шейдер для записи в буфер глубины.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Непрозрачные резервные копии

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

WorldAnchors (HoloLens)

Наряду с обеспечением соответствия правильным конфигурациям для обеспечения стабильности визуализации важно обеспечить стабильность голограмм в правильном физическом расположении. Чтобы сообщить платформе о важных расположениях в физическом пространстве, разработчики могут использовать WorldAnchors в GameObjects, которые должны оставаться в одном месте. WorldAnchor — это компонент, добавленный в GameObject, который получает абсолютный контроль над преобразованием этого объекта.

Такие устройства, как HoloLens, постоянно проверяют среду и изучают ее. Таким образом, по мере того как HoloLens отслеживает перемещение & положение в пространстве, его оценки будут обновлены, а система координат Unity скорректирована. Например, если GameObject находится в 1 м от камеры при запуске, так как HoloLens отслеживает среду, он может понять, что физическая точка, в которой находится GameObject, на самом деле находится на 1,1 м. Это приведет к смещению голограммы. Применение WorldAnchor к GameObject позволит привязке управлять преобразованием объекта, чтобы объект оставался в правильном физическом расположении (т. е. при обновлении до 1,1 м вместо 1 м во время выполнения). Для сохранения WorldAnchors в сеансах приложений разработчики могут использовать WorldAnchorStore для сохранения и загрузки WorldAnchors.

Примечание

После добавления компонента WorldAnchor в GameObject невозможно изменить преобразование этого объекта GameObject (т. е. transform.position = x). Чтобы изменить преобразование, разработчик должен удалить WorldAnchor.

WorldAnchor m_anchor;

public void AddAnchor()
{
    this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}

public void RemoveAnchor()
{
    DestroyImmediate(m_anchor);
}

Если вам нужна альтернатива ручной работе с привязками, проверка средства блокировки Microsoft World Locking Tools.

См. также статью