Реализация LiDAR-сканирования в iOS AR-приложении
LiDAR-сенсор появился в iPad Pro 2020, iPhone 12 Pro и старше. ARKit использует его данные через ARWorldTrackingConfiguration с включённым sceneReconstruction — и это меняет всё, что касается качества plane detection, окклюзии объектов и скорости инициализации сцены.
Без LiDAR ARKit определяет горизонтальные плоскости за 2–5 секунд, вертикальные — ещё дольше. С LiDAR получаем меш окружения за доли секунды. Это не маркетинг — это разница между «AR-объект появляется сразу» и «пользователь машет телефоном 10 секунд перед тем, как что-то произойдёт».
Где конкретно ломается LiDAR-интеграция
Первая проблема — ARMeshGeometry даёт слишком плотный меш. Типичный фрейм: 50 000–200 000 вершин на комнату средних размеров. Если передавать это напрямую в SceneKit или RealityKit без LOD и culling, FPS проседает уже на A14.
Решение: используем ARMeshAnchor и ARMeshGeometry.faces для разреженного меша, а для отображения — ModelEntity с MeshResource.generate(from:) только для видимых секций. ARView в RealityKit умеет делать это через sceneUnderstanding.options с флагом .occlusion — он активирует только необходимый subset меша для расчёта окклюзии, не рендеря весь.
Вторая проблема — raycast в LiDAR-режиме. ARRaycastQuery с типом .estimatedPlane работает иначе, чем .existingPlaneGeometry. На устройствах с LiDAR правильный путь: ARRaycastQuery(origin:direction:allowing:.estimatedPlane, alignment:.any) с последующим уточнением через меш. Если добавить .existingPlaneGeometry как fallback — получаем двойные хиты и артефакты размещения.
Третья — sessionWasInterrupted. Когда пользователь сворачивает приложение, LiDAR-сессия сбрасывает накопленный меш. При восстановлении нужно вызвать session.run(configuration, options: [.removeExistingAnchors, .resetSceneReconstruction]) — без .resetSceneReconstruction старые ARMeshAnchor-и накладываются на новые с дрейфом.
Как мы строим LiDAR-пайплайн
Используем RealityKit 2 как основной рендер-слой: он напрямую интегрирован с ARKit 5+ и использует Metal для рендеринга мешей без CPU-оверхеда SceneKit. Конфигурация:
let config = ARWorldTrackingConfiguration()
config.sceneReconstruction = .meshWithClassification
config.environmentTexturing = .automatic
config.frameSemantics = [.personSegmentationWithDepth]
arView.session.run(config)
meshWithClassification включает классификацию поверхностей (пол, стена, потолок, окно, дверь) — это позволяет фильтровать ARMeshAnchor по ARMeshClassification и реагировать только на нужный тип поверхности. Для приложений с расстановкой мебели или навигацией в помещении это критично.
Для окклюзии объектов за реальными предметами включаем:
arView.environment.sceneUnderstanding.options = [.occlusion, .physics]
.physics добавляет коллизии AR-объектов с реальными поверхностями — AR-куб падает на стол и не проваливается сквозь него.
Кейс: приложение для примерки мебели, iPhone 13 Pro. Без LiDAR-окклюзии диван «висел» поверх ног пользователя при съёмке себя. С .occlusion ноги корректно перекрывают AR-объект. Время инициализации плоскости — 0.3 секунды против 4.2 секунды на нон-LiDAR устройстве.
Fallback для устройств без LiDAR
LiDAR есть только с iPhone 12 Pro. Для широкого охвата пишем два пути:
if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) {
// LiDAR path
} else {
// Plane detection fallback
config.planeDetection = [.horizontal, .vertical]
}
Это не просто if — это разные UX-сценарии. На нон-LiDAR устройствах показываем индикатор «наведите на поверхность», на LiDAR — сразу предлагаем разместить объект.
Что входит в работу
- Настройка
ARWorldTrackingConfigurationсsceneReconstructionи классификацией поверхностей - Реализация окклюзии и физики через RealityKit
sceneUnderstanding - Оптимизация рендеринга меша (LOD, frustum culling, разреженный меш)
- Корректный raycast с LiDAR и fallback для нон-LiDAR устройств
- Обработка прерываний сессии и восстановление состояния
- Тестирование на реальных устройствах (iPhone 12 Pro+, iPad Pro)
Сроки
| Сложность | Сроки |
|---|---|
| Базовая LiDAR-интеграция с окклюзией | 1–2 недели |
| Полноценный пайплайн + fallback + оптимизация | 3–5 недель |
| Кастомные классификаторы поверхностей + AR-физика | 6–8 недель |
Стоимость рассчитывается индивидуально после анализа требований к AR-сцене и целевых устройств.







