Если коротко:

Mixed Reality Occlusion сравнивает глубину виртуального пикселя с глубиной реальной сцены. Если стол, рука или другой физический объект ближе к камере, соответствующая часть виртуального объекта не выводится. Depth API обновляет карту глубины динамически, scene mesh описывает заранее распознанную комнату, а ручная маска подходит для известной геометрии. Неточность глубины и задержка дают дрожание и ореолы на границах.

Mixed Reality Occlusion создаёт правильный порядок глубины между реальным и виртуальным миром. Когда физическая рука проходит перед virtual object, его закрытая часть исчезает; когда объект ближе руки, он остаётся видимым. Без этого passthrough выглядит как видеофон под графикой.

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

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

OpenXR передаёт depth information с projection layer, но доступ к глубине окружения зависит от runtime. На Meta Quest Unity получает Environment Depth через Meta OpenXR.

Depth API: динамическая окклюзия

Depth API обновляет карту глубины в реальном времени. Поэтому moving objects, hands и передвинутая мебель могут закрывать цифровой контент без заранее созданной модели. Meta указывает поддержку для Quest 3 и Quest 3S.

Близкие поверхности примерно до 0,2 м оцениваются ненадёжно, а быстрое движение может оставить запаздывающий контур. Поэтому dynamic occlusion проверяют на устройстве.

Scene mesh: статичная комната

Scene API и MR Utility Kit строят mesh стен, пола и мебели. Геометрия пригодна для окклюзии неподвижных поверхностей, размещения и столкновений. Подробнее см. scene understanding.

Scene mesh не знает, что человек вошёл в комнату или кресло передвинули. Сочетание с Depth API добавляет динамические изменения.

Ручные маски и известная геометрия

Если форма и поза предмета известны, developers могут отрисовать невидимый occluder только в depth buffer. Следом virtual objects проходят тест глубины и скрываются за маской. Метод подходит для tracked object или hands.

Маска работает без Depth API, но верна лишь пока совпадает с предметом. Ошибка трекинга создаёт заметный вырез, а непрозрачный mesh не воспроизводит полупрозрачный материал.

Hard и soft occlusion

Hard occlusion дешевле, но подчёркивает ступенчатый и дрожащий край. Soft occlusion смешивает пиксели возле границы и выглядит спокойнее, хотя требует больше GPU.

Когда виртуальный объект лежит на реальном столе, ошибка depth вызывает z-fighting. Небольшой depth bias отделяет слои, но слишком большое значение создаёт ореол.

Тонкая геометрия, волосы и прозрачность остаются сложными случаями. В Unity-примере Meta low-resolution hand заменяется tracked hand mesh ради более чистых границ пальцев.

Как выбрать метод

  • Для людей и движущихся предметов нужен Depth API.
  • Для стен и мебели полезен scene mesh.
  • Для известного tracked object подходит ручной depth-only occluder.
  • Для интерфейса иногда лучше вовсе исключить поверхность из окклюзии, чтобы важная панель не исчезала.

Начинайте с корректного passthrough, затем проверяйте разные расстояния и движение. Симулятор не показывает реальный шум и задержку сенсора.

Итог

Depth API даёт текущую глубину, scene mesh хранит статичную структуру комнаты, а ручная маска представляет известный физический объект. Убедительный результат обычно сочетает методы и скрывает ошибки краёв мягким переходом, разумным bias и дизайном сцены.

Поделиться:TelegramВКонтакте

Источники

  1. Meta Horizon OS Developers: Depth API Overview
  2. Meta Horizon OS Developers: Occlusions Overview
  3. Meta Horizon OS Developers: Passthrough Occlusions in Unity
  4. Unity Meta OpenXR: Occlusion
  5. OpenXR Specification: composition layer depth