AR/VR

ARKit и ARCore

В 2017 году Apple выпустила ARKit - и за несколько недель App Store заполнился тысячами AR-приложений. Разработчики не писали алгоритмы компьютерного зрения с нуля: фреймворк скрыл за собой годы исследований по SLAM, VIO и нейронным сетям. Но понимать, что происходит внутри, критично - иначе непонятно, почему AR «теряет» сцену при резком движении или почему объект «плывёт» на плоскости.

  • **IKEA Place** - plane detection для позиционирования мебели в комнате
  • **Snapchat и Instagram маски** - face tracking с blend shapes в реальном времени
  • **Measure (встроенное в iOS)** - AR-рулетка на plane detection и anchor'ах
  • **Google Maps Live View** - world anchors для AR-навигации по улицам

Plane Detection: как телефон видит поверхности

Приложение IKEA Place позволяет поставить виртуальный диван в комнату и посмотреть, как он смотрится. Но откуда телефон знает, где находится пол? Камера видит только поток пикселей - никакой явной геометрии. Здесь в дело вступает **plane detection** - алгоритм, который восстанавливает геометрию сцены из движущейся камеры.

ARKit и ARCore используют технику **Visual-Inertial Odometry (VIO)**: данные с камеры совмещаются с показаниями гироскопа и акселерометра. Алгоритм отслеживает характерные точки (feature points) в кадре, вычисляет их движение между кадрами и строит разреженное облако точек. Кластеры точек, лежащие в одной плоскости, объединяются в плоскость.

Плоскости уточняются со временем: при первом обнаружении они маленькие и неточные. Через несколько секунд движения ARKit расширяет их и выравнивает - это событие `didUpdate node for anchor`. Приложения обычно отображают сетку поверх плоскостей, сигнализируя пользователю, что поверхность распознана.

ПараметрARKit (iOS)ARCore (Android)
Горизонтальные плоскостиДаДа
Вертикальные плоскостиДа (A12+)Да
Наклонные плоскостиДа (ARKit 3.5+)Ограниченно
Данные глубиныLiDAR (iPhone 12 Pro+)ToF датчик (некоторые Android)

Plane detection в ARKit/ARCore основан прежде всего на:

World Anchors: объекты, которые «прилипают» к миру

После обнаружения поверхности нужно разместить виртуальный объект так, чтобы он оставался на месте при движении камеры. Для этого служат **anchors** - привязки в мировом пространстве. Anchor хранит позицию и ориентацию в системе координат сессии; когда ARKit уточняет карту мира, он корректирует трансформации всех anchor'ов, и объекты остаются на месте.

**Persistent anchors** позволяют сохранять позиции между сессиями. ARKit сохраняет ARWorldMap - карту с облаком точек и anchor'ами - на диск. При следующем запуске в том же помещении карта загружается, и объекты появляются на исходных местах. Именно так работают AR-приложения для коллаборации: несколько устройств делят одну карту.

ARCore использует термин **Cloud Anchors** для межустройственного sharing: anchor загружается на сервер Google, другие устройства скачивают его и локализуются относительно него. Это основа мультиплеерных AR-опытов.

Зачем ARKit обновляет трансформацию anchor после его создания?

Light Estimation: виртуальный свет в реальной комнате

Виртуальный куб, вставленный в реальную комнату, выглядит фальшиво, если освещён не так, как окружающие предметы. AR-объект на солнечной стороне комнаты должен быть ярким, в тени - тёмным. **Light estimation** анализирует кадры камеры и восстанавливает параметры освещения реальной сцены.

ARKit предлагает два уровня: базовый (intensity + colorTemperature) и продвинутый (**Environment Lighting** через сферические гармоники). Сферические гармоники кодируют распределение света по всем направлениям - примерно как HDR panorama, только сжатая в несколько коэффициентов.

На устройствах с LiDAR (iPhone 12 Pro+) ARKit также оценивает направление источника света и создаёт корректные тени от виртуальных объектов на реальных поверхностях - это называется **Scene Geometry** + ray casting для теней.

Сферические гармоники в light estimation нужны для:

Face Tracking: ARFaceAnchor и blend shapes

Snapchat-маски, Animoji, виртуальная примерка очков - всё это face tracking. ARKit использует фронтальную TrueDepth-камеру (инфракрасный проектор + IR-камера), чтобы строить точную 3D-модель лица в реальном времени. На Android ARCore Face Mesh строит модель из RGB-камеры с помощью ML-модели.

ARKit возвращает **ARFaceAnchor** - он содержит 3D-мesh лица (1220 вершин) и **blendShapes**: словарь из 52 коэффициентов, каждый описывает мимику. Коэффициент `jawOpen` означает, насколько открыт рот (0 - закрыт, 1 - максимально открыт). Именно эти коэффициенты Animoji использует для анимации 3D-персонажей.

  • **jawOpen, jawLeft, jawRight** - движение нижней челюсти
  • **mouthSmileLeft/Right** - улыбка
  • **eyeBlinkLeft/Right** - моргание
  • **browOuterUpLeft/Right** - поднятие бровей
  • **tongueOut** - язык (ARKit 3+)

Face tracking требует фронтальной камеры с TrueDepth (Face ID iPhone). На устройствах без TrueDepth ARKit включает ограниченный режим через обычную фронтальную камеру с меньшим числом blend shapes.

Face tracking доступен на любом iPhone с ARKit

Полный face tracking с 52 blend shapes требует TrueDepth-камеру (Face ID). Без неё - ограниченная версия через RGB-камеру

TrueDepth проецирует 30 000 инфракрасных точек и считывает их - это позволяет строить точную 3D-геометрию лица. RGB-камера только анализирует текстуру, поэтому менее точна

Blend shapes в ARFaceAnchor - это:

ARKit и ARCore

  • Plane detection строит геометрию сцены через VIO: feature points камеры + IMU; плоскости уточняются со временем
  • Anchors фиксируют виртуальные объекты в мировых координатах; при уточнении карты ARKit корректирует их трансформацию
  • Light estimation от базового (intensity/temperature) до сферических гармоник позволяет виртуальным объектам отражать реальное окружение
  • Face tracking возвращает 3D-mesh лица и 52 blend shapes для управления мимикой персонажей

Связанные темы

AR-фреймворки - это фундамент, на котором строятся более высокоуровневые возможности.

  • Web AR и WebXR — Следующий шаг: AR без установки приложения
  • VR: оптимизация производительности — Предыдущий урок: frame budget и foveated rendering

Вопросы для размышления

  • Почему plane detection теряет точность при быстром движении камеры и как это влияет на поведение anchor'ов?
  • В каких сценариях Cloud Anchors ARCore предпочтительнее локальных ARWorldMap из ARKit?
  • Как light estimation через сферические гармоники соотносится с техниками image-based lighting в традиционной 3D-графике?

Связанные уроки

  • ml-01-intro
ARKit и ARCore

0

1

Войти