Интеграция ARKit: от трекинга до Face Tracking
В нашей практике мы сталкиваемся с тем, что ARKit — не просто наложение 3D-объектов на камеру. Это связка из LiDAR-сканера, Visual Inertial Odometry и нейросетевых моделей для понимания сцены, которая при неправильном использовании даёт нестабильный tracking, артефакты окклюзии и крэш при ARSession в background. Ниже разберём ключевые проблемы и способы их решения, опираясь на опыт ARKit-разработки в реальных проектах.
Почему трекинг срывается в тёмных сценах?
Трекинг падает при плохом освещении. ARWorldTrackingConfiguration строит карту по точкам интереса (feature points) — в тёмных помещениях или на однотонных поверхностях tracking деградирует до ARCamera.TrackingState.limited(.insufficientFeatures). Игнорировать этот state нельзя: если не показывать пользователю, что нужно осветить сцену, anchors начинают дрейфовать, и 3D-объект улетает в сторону. Правильно — подписываться на session(_:cameraDidChangeTrackingState:) и показывать соответствующую инструкцию.
Как ускорить обнаружение плоскостей?
Плоскости обнаруживаются с задержкой. ARPlaneDetection.horizontal находит пол за 2–4 секунды при хорошем освещении. Если пользователь пытается разместить объект раньше — промах. Частое решение: делать plane detection опциональным и добавлять raycast против ARMeshAnchor с LiDAR — на iPhone 12 Pro+ это даёт точность попадания ~1 см без ожидания. Сравнение: raycast обеспечивает на 40% более стабильные результаты, чем устаревший hitTest.
Что делать с окклюзией без LiDAR?
Окклюзия работает только с LiDAR. ARView.environment.sceneUnderstanding.options с .occlusion — исключительно на устройствах с LiDAR (Pro-серия с iPhone 12). На iPhone без LiDAR объект всегда поверх реального мира. Нужно чекать ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) при старте и деградировать gracefully: отключать окклюзию и использовать полупрозрачные тени.
Как настроить Image Tracking?
ARImageTrackingConfiguration с maximumNumberOfTrackedImages = 4 — для маркерного AR. Референсные изображения загружаем из ARReferenceImage с физическим размером. physicalWidth критичен — ARKit использует его для вычисления дистанции и масштаба. Неверный размер = объект висит не там где надо.
let referenceImage = ARReferenceImage(
cgImage,
orientation: .up,
physicalWidth: 0.15 // 15 см в реальном мире
)
config.trackingImages = [referenceImage]
Как использовать Face Tracking?
ARFaceTrackingConfiguration работает только на устройствах с TrueDepth-камерой (Face ID). Доступно 52 blend shape коэффициента через ARFaceAnchor.blendShapes — от .jawOpen до .eyeBlinkLeft. На этом строим виртуальные примерки, AR-аватары и Liveness Detection.
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let faceAnchor = anchors.first as? ARFaceAnchor else { return }
let jawOpen = faceAnchor.blendShapes[.jawOpen]?.floatValue ?? 0
// Управляем анимацией персонажа
}
Как повысить производительность AR-приложения?
ARKit + RealityKit нагружают GPU и CPU одновременно. Инструменты диагностики: Xcode Reality Composer Pro для превью сцены, GPU Frame Capture для анализа draw calls, Metal System Trace в Instruments для диагностики GPU bubbles.
Типичные узкие места:
- USDZ с > 100K полигонов на середнячке — просадка до 30 FPS.
- Несколько ModelEntity без инстансинга копируют геометрию в памяти.
- arView.renderOptions — отключение
.disableDepthOfFieldи.disableMotionBlurдаёт +15% FPS на старых устройствах.
Сравнение конфигураций трекинга
| Тип трекинга | Конфигурация | Требования к устройству | Точность |
|---|---|---|---|
| World Tracking | ARWorldTrackingConfiguration | A9+ (iPhone 6s+) | Высокая (с LiDAR ~1 см) |
| Image Tracking | ARImageTrackingConfiguration | A9+ | Зависит от маркера |
| Face Tracking | ARFaceTrackingConfiguration | TrueDepth (Face ID) | 52 blend shapes |
| Body Tracking | ARBodyTrackingConfiguration | A12+ (iPhone XS+) | Скелет 19 joints |
Оптимизации производительности
| Оптимизация | Прирост FPS | Условия |
|---|---|---|
| Отключить Depth of Field | +15% | iPhone XR и старше |
| Отключить Motion Blur | +10% | Все устройства |
| Использовать instancing | -50% памяти | Много одинаковых объектов |
Пошаговая инструкция по размещению объекта
- Запустить сессию
ARWorldTrackingConfigurationс включённымplaneDetectionиenvironmentTexturing. - Дождаться события
session(_:didAdd:)или выполнить raycast из центра экрана. - Создать
ARAnchorс результатом raycast. - Загрузить USDZ-модель через
ModelEntity.loadModel. - Создать
AnchorEntityс привязкой к anchor. - Добавить
AnchorEntityв сцену.
Пример кода размещения по raycast
let query = arView.makeRaycastQuery(
from: arView.center,
allowing: .estimatedPlane,
alignment: .horizontal
)
if let query = query,
let result = arView.session.raycast(query).first {
let anchor = ARAnchor(name: "placed-object", transform: result.worldTransform)
arView.session.add(anchor: anchor)
let modelEntity = try! ModelEntity.loadModel(named: "model.usdz")
let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(modelEntity)
arView.scene.addAnchor(anchorEntity)
}
Что входит в работу по интеграции ARKit
- Аудит требований и совместимости устройств (целевые модели, наличие LiDAR).
- Проектирование AR-архитектуры с graceful деградацией на старых устройствах.
- Разработка ядра AR: сессия, anchors, распознавание плоскостей/изображений/лиц.
- Интеграция 3D-контента: конвертация в USDZ, настройка PBR-материалов.
- Тестирование на физических устройствах (минимум 5 моделей).
- Оптимизация производительности под целевые устройства.
- Передача исходного кода, документация и обучение команды.
Сроки интеграции
Базовая интеграция ARKit с размещением USDZ-объекта по плоскости: 3–5 дней. Image tracking с маркерами и наложением контента: 4–7 дней. Комплексное решение с face tracking, окклюзией LiDAR и кастомными шейдерами Metal: 3–6 недель. Стоимость рассчитывается индивидуально в зависимости от сложности 3D-контента и требований к поддерживаемым устройствам.
Мы занимаемся iOS-разработкой более 5 лет и выполнили 20+ AR-проектов для различных отраслей. Если вы хотите внедрить дополненную реальность в своё приложение, свяжитесь с нами — оценим проект и предложим оптимальное решение. Оцените свой проект на предмет AR-возможностей — получите консультацию нашего инженера.







