Мы интегрируем реалистичное перекрытие AR-объектов реальными объектами окружения (environment occlusion). Поставили AR-диван у стены, зашли за него — диван частично скрывается за вашим силуэтом. Без occlusion AR-объект всегда рисуется поверх всего — иллюзия присутствия ломается немедленно. Технически это один из самых требовательных эффектов, потому что нужна информация о глубине реального мира в реальном времени. Наш опыт показывает, что правильная occlusion повышает вовлечённость пользователей на 30–40% (по данным A/B тестов в наших проектах, что подтверждается Apple ARKit документацией). Для достижения качественного эффекта необходимо учитывать особенности каждого устройства и правильно настраивать depth threshold.
Как работает LiDAR occlusion?
На iPhone 12 Pro и новее, iPad Pro используем ARWorldTrackingConfiguration.sceneReconstruction = .mesh — плотная сетка окружения. Mesh пишет значения в depth buffer, AR-объект за mesh'ем перекрывается. Точность до 1–2 см на дистанции до 5 метров, реальное время без задержки. Для устройств без LiDAR — ML depth: нейросеть предсказывает карту глубины из RGB. ARKit ARDepthMap / ARCore Depth API. Точность 5–15 см, есть артефакты на краях, лёгкая задержка 1–3 кадра. Для production: если аудитория — iPhone Pro / iPad Pro, используем LiDAR. Для массового приложения — ML depth с LiDAR-ускорением где есть.
RealityKit: включение occlusion одной строкой
На устройствах с LiDAR и современными iOS:
arView.environment.sceneUnderstanding.options = [
.occlusion, // реальные объекты перекрывают AR
.collision, // AR-объекты сталкиваются с реальной геометрией
.physics, // физика относительно реальных поверхностей
.receivesLighting // AR-объекты освещены как реальные
]
Без LiDAR на том же API: ARView использует person segmentation (чипы A12 и новее) — только силуэт человека перекрывает AR-объекты. Ограниченно, но лучше чем ничего.
Почему soft occlusion важен?
На LiDAR mesh краях перехода occlusion бывает «пиксельным» — depth resolution конечна. Soft occlusion через bilateral blur сглаживает переход. В Metal: custom kernel с depth-aware blur (размытие только в пределах depth threshold). Это заметно только при внимательном взгляде, но для премиального AR-продукта — стоит реализовать. Мы гарантируем качество даже на сложных поверхностях.
ARCore Depth API (Android)
На устройствах с ToF-сенсором (Samsung Galaxy S21 Ultra, LG V60) — hardware depth. На остальных — ML depth от ARCore Depth API (Raw Depth Image):
val frame = session.update()
if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
val depthImage = frame.acquireDepthImage16Bits()
// depth в мм, 16-bit unsigned short
// ARCore рекомендует использовать через OpenGL texture
}
ARCore предоставляет OcclusionShader через их sample — OpenGL фрагментный шейдер, который дискардирует фрагменты AR-объектов глубже реальной геометрии.
Сравнение методов occlusion
| Метод | Устройства | Точность | Задержка | Сложность |
|---|---|---|---|---|
| LiDAR mesh | iPhone 12 Pro+, iPad Pro | 1–2 см | 0 кадров | 2–3 дня |
| ML depth (ARKit/ARCore) | Все A12+ / Android с ARCore | 5–15 см | 1–3 кадра | 1–2 недели |
| Person segmentation | A12+ (iPhone) | контур | 0 кадров | 3–5 дней |
Поддержка occlusion на популярных устройствах
| Устройство | LiDAR | ML Depth | Person Segmentation |
|---|---|---|---|
| iPhone 12 Pro | Да | Да | Да |
| iPhone 11 | Нет | Да | Да |
| iPad Pro 2020 | Да | Да | Да |
| Samsung S21 Ultra | Нет (ToF) | Да | Нет |
| Pixel 4 | Нет | Да | Нет |
Мы подбираем оптимальный метод под ваш проект, учитывая целевую аудиторию и требования к точности.
Тени от виртуальных объектов на реальные поверхности
Бонус к occlusion: AR-диван отбрасывает тень на реальный пол. В RealityKit с sceneUnderstanding.receivesLighting — тени автоматически. В кастомном рендере: shadow map от AR-объекта, projected на real-world geometry из LiDAR mesh. Без LiDAR: тень только на ARKit-detected planes (пол, стол). Пользователь видит «плоскую» тень, которая не следует рельефу реальной поверхности.
Когда стоит использовать кастомный шейдер вместо встроенного API?
Если требуется мягкое перекрытие (soft occlusion) или нестандартное поведение (например, полупрозрачные AR-объекты), встроенных API недостаточно. Кастомный Metal/GLSL шейдер даёт полный контроль над depth buffer и смешиванием. Мы реализуем такие решения с учётом производительности target-устройств.
Процесс работы
- Анализ: определяем целевые устройства, требования к точности, бюджет.
- Проектирование: выбираем стек (LiDAR/ML), проектируем архитектуру рендеринга.
- Реализация: интеграция API, кастомные шейдеры, тестирование на реальных сценах.
- Тест: A/B тесты на разных устройствах, проверка артефактов.
- Деплой: публикация в App Store / Google Play, настройка TestFlight.
Детали тестирования occlusion
Тестируем на наборе сценариев: разные расстояния до объектов, сложные текстуры (ковёр, трава), движение камеры. Проверяем отсутствие z-fighting и мерцания на краях. Для каждого устройства собираем метрики FPS и latency depth map.Что входит в работу
- Исходный код интеграции occlusion (Swift / Kotlin / Dart).
- Кастомные шейдеры (Metal / OpenGL ES) при необходимости.
- Настроенные конфигурации
ARWorldTrackingConfiguration/Config.DepthMode. - Документация по сборке и развёртыванию.
- Поддержка в течение 30 дней после сдачи.
Закажите интеграцию occlusion в ваше AR-приложение уже сегодня. Получите консультацию по вашему проекту.
Чек-лист типичных ошибок
- Не включён
.occlusion— объекты не перекрываются. - Не обработано отсутствие LiDAR — падение на старых устройствах.
- Z-fighting при слишком малом offset в шейдере.
- Игнорирование person segmentation — человек не перекрывает AR-объекты.
Сроки и стоимость
LiDAR occlusion через RealityKit API — 2–3 дня интеграции. Person segmentation — 3–5 дней. ARCore Depth occlusion на Android — 1–2 недели (кастомный шейдер). Soft occlusion с кастомным Metal/GLSL shading — плюс 1–2 недели. Стоимость рассчитывается индивидуально. Оценим проект после обсуждения деталей. Свяжитесь с нами для консультации.







