Реалізація оклюзії віртуальних об'єктів реальними предметами в AR

Наша компанія з розробки відеоігор веде незалежні проекти, спільно з клієнтом створює ігри та надає додаткові операційні послуги. Досвід нашої команди дозволяє нам охопити всі ігрові платформи та розробити приголомшливий продукт, що відповідає баченню клієнта та перевагам гравців.

Від імерсивних застосунків до ігрових світів і 3D-сцен

Наша виділена команда для VR/AR/MR-розробки, Unity-продакшну і 3D-моделювання та анімації — з власними кейсами і презентаціями.

Відвідати персоналізований сайт
Показано 1 з 1 послугУсі 242 послуг
Реалізація оклюзії віртуальних об'єктів реальними предметами в AR
Складна
~1-2 тижні
Часті питання

Наші компетенції

Які етапи розробки гри?

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    683
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    862
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    491
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    533

Реалізація оклюзії віртуальних об'єктів реальними предметами в AR

Без оклюзії AR виглядає як наклейка поверх реальності. Віртуальний персонаж стоїть за реальним стільцем – але стілець не перекриває персонажа, та ілюзія рассипається. Користувач миттєво це чита як "накладення картинки", а не як присутність об'єкта у просторі.

AR Foundation 5.x надає AROcclusionManager – компонент, який використовує карту глибини з сенсора (LiDAR на iPhone Pro / iPad Pro, depth estimation на пристроях без LiDAR) для маскування віртуальних об'єктів за реальними. Але "просто додати компонент" не працює.

Де оклюзія ломається

На пристроях з LiDAR карта глибини (environmentDepthTexture) оновлюється у реальному часі з частотою близько 30 fps – це чесний depth buffer реального світу. На Android та iPhone без LiDAR AR Foundation використовує ML-оцінку глибини через AROcclusionManager.requestedEnvironmentDepthMode = EnvironmentDepthMode.Best, що дає значно більше артефактів на краях.

Головна проблема – розрив між глибиною реального світу та Z-буфером Unity. Віртуальні об'єкти рендерються у стандартному пайплайні з звичайним depth testing, а "реальний світ" приходить як 2D-текстура. Потрібно явно реалізовувати оклюзію: рендерити реальні поверхні у глибину через DepthShader, записувати в depth buffer до рендеру віртуальних об'єктів.

Конкретно в URP це виглядає так: створюється ScriptableRendererFeature з двома RenderPass. Перший проход бере environmentDepthTexture з AROcclusionManager, конвертує в depth buffer (враховуючи різницю в near/far clip плейнах між AR-камерою та Unity-камерою) та записує в _CameraDepthTexture. Другий проход – стандартний рендер сцени. Віртуальні об'єкти автоматично отримують коректний depth test щодо реального світу.

Звучить просто, але є нюанс: конвертація глибини. AR Foundation повертає лінійну глибину в метрах, Unity depth buffer – нелінійний (logarithmic або reversed-Z залежно від налаштувань). Неправильна конвертація дає "мерцання" на граничах оклюзії або повне відсутність ефекту.

М'які краї та альфа-змішення

Жорстока оклюзія – об'єкт або видно, або ні – виглядає грубо. На краях реальних об'єктів карта глибини завжди має неточності: розмиття, артефакти ML-оцінки. Віртуальний об'єкт ріже по цьому нечіткому краю, та отримується зубчата границя.

Правильне рішення – soft occlusion через розмиття карти глибини перед depth testing. AROcclusionManager в AR Foundation 5.x підтримує OcclusionPreferenceMode.PreferEnvironmentOcclusion та PreferSmoothOcclusion – другий режим застосовує bilateral filter для згладжування границь. Але в URP це потрібно підключати вручну через кастомний рендер пасс; автоматично це працює тільки в Built-in RP.

На практиці ми робимо так: у шейдері віртуального об'єкта додаємо стадію оклюзії з smoothstep по порівнянню глибини реального світу та глибини об'єкта. Діапазон змішення – 2–5 см у світових координатах. Це дає плавний перехід на краях без явних артефактів.

Кейс: персонаж за меблями

Проект – AR-гра з мобільним AR-персонажем, який взаємодіє з реальною кімнатою. Завдача: персонаж повинен "сховатися" за реальними предметами меблі.

Без LiDAR (основна аудиторія – середньорядні Android) довелось використовувати ML-depth estimation. Проблема: ML погано працює на однорідних поверхнях (біла стіна, гладкий стіл) – глибина там нестабільна, та персонаж "проваливався" в стіл або виходив перед ним хаотично.

Рішення – гібридний підхід. Для крупних виявлених площин (ARPlane) використовуємо точну геометрію з ARPlaneManager (ми знаємо їх положення у просторі), рендеримо як 3D-меші у depth buffer. ML-depth використовуємо тільки для об'єктів, які не є площинами – стільці, люди, предмети на столі. Це убрало 80% артефактів на типових інтер'єрних сценах.

Терміни та процес

Оцінка починається з аудиту цільових пристроїв та поточного рендер-пайплайну. URP та HDRP потребують різних підходів. HDRP у мобільному AR практично не використовується – занадто важкий, але якщо проект для Magic Leap або HoloLens, там своя специфіка.

Сценарій Терміни
Базова оклюзія через AROcclusionManager (URP) 3–7 днів
М'яка оклюзія з кастомним рендер пассом 1–2 тижні
Гібридний підхід (площини + ML depth) 2–4 тижні
HoloLens / Magic Leap (окремий пайплайн) від 3 тижнів

Вартість – після аналізу проекту та цільових платформ. Ключові питання: який RP, є ли LiDAR у цільовій аудиторії, потрібна ли підтримка Android нижче ARCore 1.24.