Реалізація LiDAR-сканування в iOS AR-додатку
Відколи з'явився LiDAR на пристроях Apple, ми в TrueTech (5+ років досвіду, 20+ AR-проєктів) спеціалізуємося на його інтеграції для AR-додатків. За цей час реалізували понад 20 проєктів, де точне сканування простору стало ключовим — від примірювання меблів до навігації всередині приміщень. Наш досвід дозволяє гарантувати стабільну роботу на пристроях з LiDAR та коректний fallback для решти.
LiDAR-сенсор з'явився в iPad Pro, iPhone 12 Pro та старших. ARKit використовує його дані через ARWorldTrackingConfiguration з увімкненим sceneReconstruction — і це змінює все, що стосується якості plane detection, оклюзії об'єктів та швидкості ініціалізації сцени. За нашими вимірами, LiDAR-сесія стартує в 10 разів швидше, ніж площинне детектування на non-LiDAR пристроях.
Без LiDAR ARKit визначає горизонтальні площини за 2–5 секунд, вертикальні — ще довше. З LiDAR отримуємо меш середовища за частки секунди. Це не маркетинг — це різниця між «AR-об'єкт з'являється одразу» та «користувач махає телефоном 10 секунд перед тим, як щось відбудеться».
Як правильно налаштувати LiDAR-конфігурацію?
Перша проблема — ARMeshGeometry дає надто щільний меш. Типовий фрейм: 50 000–200 000 вершин на кімнату середніх розмірів (близько 20 м²). Якщо передавати це напряму в SceneKit або RealityKit без LOD та culling, FPS просідає вже на A14 (до 25 кадрів/с при 100K вершин).
Рішення: використовуємо ARMeshAnchor та ARMeshGeometry.faces для розрідженого меша (наприклад, 20% вершин), а для відображення — 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 секунди на non-LiDAR пристрої, що в 14 разів швидше.
Як реалізувати LiDAR-сканування: покроковий план
-
Перевірка доступності LiDAR. Викличте
ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh). Якщоtrue— використовуйте LiDAR-шлях, інакше — plane detection. - Налаштування конфігурації. Увімкніть
.meshWithClassificationта.environmentTexturing.automatic. Для захоплення глибини додайте.personSegmentationWithDepth. - Рендеринг з оклюзією. В RealityKit увімкніть
sceneUnderstanding.options = [.occlusion, .physics]. Для користувацького рендерингу використовуйтеARMeshAnchorз LOD (наприклад, LOD0: 100% вершин, LOD1: 30%). - Raycast з LiDAR. Використовуйте
.estimatedPlaneзalignment: .any. При відсутності LiDAR — fallback на.existingPlaneGeometry. - Обробка переривань. В
sessionWasInterruptedвикличте перезапуск з опціямиremoveExistingAnchorsтаresetSceneReconstruction.
Що LiDAR дає порівняно з plane detection
| Критерій | З LiDAR | Без LiDAR (plane detection) |
|---|---|---|
| Час ініціалізації сцени | 0.2–0.5 с | 2–5 с |
| Якість оклюзії | Повна, з урахуванням глибини | Відсутня або приблизна |
| Визначення вертикальних поверхонь | Миттєво | Ускладнено (10-15 с) |
| Навантаження на CPU/GPU | Високе (оптимізоване GPU instancing) | Помірне |
Fallback для пристроїв без LiDAR
LiDAR є лише з iPhone 12 Pro. Для широкого охоплення пишемо два шляхи:
if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) {
// LiDAR path
} else {
// Plane detection fallback
config.planeDetection = [.horizontal, .vertical]
}
Це не просто if — це різні UX-сценарії. На non-LiDAR пристроях показуємо індикатор «наведіть на поверхню», на LiDAR — одразу пропонуємо розмістити об'єкт.
Що входить в роботу (послуга під ключ)
- Налаштування
ARWorldTrackingConfigurationзsceneReconstructionта класифікацією поверхонь - Реалізація оклюзії та фізики через RealityKit
sceneUnderstanding - Оптимізація рендерингу меша (LOD, frustum culling, vertex buffer compression)
- Коректний raycast з LiDAR та fallback для non-LiDAR пристроїв
- Обробка переривань сесії та відновлення стану
- Тестування на реальних пристроях (iPhone 12 Pro+, iPad Pro)
Терміни та вартість
| Складність | Терміни | Вартість (орієнтовно) |
|---|---|---|
| Базова LiDAR-інтеграція з оклюзією | 1–2 тижні | від $4,000 |
| Повноцінний пайплайн + fallback + оптимізація | 3–5 тижнів | від $8,000 |
| Кастомні класифікатори поверхонь + AR-фізика | 6–8 тижнів | від $15,000 |
Вартість розраховується індивідуально після аналізу вимог до AR-сцени та цільових пристроїв. Отримайте розрахунок за 1 день — пишіть нам для консультації. Ми оцінимо проєкт безкоштовно.







