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-графике?