Ми інтегруємо Scene Reconstruction в AR-застосунки, коли потрібна точна взаємодія з реальним оточенням. ARKit Documentation вказує, що без LiDAR на пристроях (iPhone 12 Pro і новіші, iPad Pro 2020+) реконструкція сцени AR неможлива — тільки детекція площин. Типова проблема: після інтеграції ARKit з sceneReconstruction = .mesh застосунок гальмує, тому що кожна вершина меша перестворюється кожен кадр. Ми вирішуємо це, працюючи напряму з Metal буферами та оновлюючи лише змінені анкори. В одному проекті для складу ми обробляли до 30 000 вершин на кадр, зберігаючи 60 FPS. Розберемо технічні деталі.
Реконструкція сцени
ARMeshAnchor накопичує геометрію кімнати в реальному часі. ARMeshGeometry зберігає вершини, нормалі та індекси трикутників. Оновлюється через делегат session(_:didUpdate:) — кожен кадр ARKit може надсилати десятки оновлених анкорів. Наївна реалізація, яка перестворює MeshResource на кожен update, вбиває main thread за секунди. Правильний підхід: оновлюємо меш тільки для змінених анкорів, використовуємо MDLMesh як проміжний формат і передаємо дані в Metal буфери напряму. 3D сітка оточення будується з використанням ARMeshAnchor.
В RealityKit це виглядає так:
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
for anchor in anchors.compactMap({ $0 as? ARMeshAnchor }) {
updateMeshVisualization(for: anchor)
}
}
func updateMeshVisualization(for anchor: ARMeshAnchor) {
let geometry = anchor.geometry
// Працюємо з geometry.vertices, geometry.faces напряму
// Не створюємо новий MeshResource кожен раз — патчимо існуючий
}
Класифікація поверхонь в AR
ARMeshClassification дає типи: floor, ceiling, wall, door, window, seat, table, none. Використовуючи класифікацію поверхонь, можна відфільтрувати непотрібні поверхні — наприклад, ігнорувати стелю для навігації по підлозі. Класифікація працює тільки при sceneReconstruction = .meshWithClassification та на пристроях з LiDAR. Без перевірки ARWorldTrackingConfiguration.supportsSceneReconstruction(.meshWithClassification) — краш або мовчазне ігнорування.
| Тип поверхні | Опис | Застосування |
|---|---|---|
| floor | Підлога | Побудова NavMesh, розташування об'єктів |
| wall | Стіна | Оклюзія, колізії |
| ceiling | Стеля | Освітлення (зазвичай ігнорується) |
| door | Двері | Навігація через отвори |
| window | Вікно | Спеціальні ефекти |
| seat | Сидіння | Взаємодія (сісти) |
| table | Стіл | Розміщення об'єктів |
| none | Невідомий об'єкт | Перешкоди (стелажі, палети) |
Як ми уникаємо просадок продуктивності?
Базовий стек: ARKit 5+ + RealityKit 2 + Metal. Розробка AR-застосунків вимагає правильної оптимізації. SceneKit не використовуємо для меша — він не оптимізований під динамічні геометрії. Налаштування сесії:
let config = ARWorldTrackingConfiguration()
config.sceneReconstruction = .meshWithClassification
arView.debugOptions = [.showSceneUnderstanding] // для відладки
arView.session.run(config)
Для візуалізації меша в режимі відладки малюємо wireframe через arView.debugOptions. У продакшені видимість меша вимикаємо, але використовуємо його дані для:
- Оклюзії AR — об'єкти за стінами не видно. Scene Reconstruction кращий за Plane Detection у 5 разів за точністю окюзії: дає в 5 разів точнішу окюзію, ніж приблизна детекція площин.
- Фізики —
CollisionComponentвзаємодіє з реальною геометрією. - Raycast — точне попадання в реальні поверхні, не тільки в площини.
Кейс з практики: навігаційний AR-застосунок для складу. Потрібно було детектувати перешкоди (стелажі, палети) та будувати маршрут. Використовували Scene Reconstruction для побудови occupancy grid: кожну вершину меша з класифікацією .none (нерозпізнаний об'єкт) додавали в граф перешкод. NavMesh оновлювався кожні 2 секунди — баланс між актуальністю та навантаженням на CPU. На iPad Pro M2 це тримає 60 FPS без просадок. Для порівняння: на пристроях без LiDAR довелося б використовувати спрощені колізії, що збільшило б кількість хибних спрацьовувань на 40%.
| Параметр | Scene Reconstruction | Plane Detection Only |
|---|---|---|
| Деталізація геометрії | ~30 000 вершин | 4 площини |
| Оклюзія | Точна, на основі меша | Приблизна, з артефактами |
| Фізика | CollisionComponent з геометрією | Тільки площини |
| Підтримка LiDAR | Обов'язкова | Не потрібна |
Що входить в нашу роботу?
- Аналіз вимог та вибір стеку (ARKit/RealityKit/Metal).
- Налаштування сесії з включенням реконструкції сцени.
- Розробка візуалізації меша (відладка та продакшен).
- Інтеграція даних меша: окюзія, фізика, raycast.
- Оптимізація продуктивності (пулінг оновлень, буферизація).
- Тестування на пристроях з LiDAR та fallback для нон-LiDAR.
- Документація та навчання команди.
Процес роботи: від ідеї до деплою
1. Аналітика — обговорюємо сценарії використання та визначаємо необхідні дані (окюзія, навігація, фізика). 2. Проектування — обираємо архітектуру (компонентна система, зв'язка ARView та Metal). 3. Реалізація — пишемо код на Swift, використовуємо паттерн делегата для оновлень. 4. Тестування — перевіряємо на реальних пристроях в різних умовах (освітлення, дзеркала). 5. Деплой — публікуємо в App Store, налаштовуємо TestFlight для бета-тестерів.Терміни та як почати
Інтеграція під ключ: від аналізу до деплою за 1–2 тижні (базова) або 4–6 тижнів (з просунутими функціями). Вартість базової інтеграції починається від $2000. Оцініть ваш проект за 1 день — пишіть нам для консультації. Ми гарантуємо якість завдяки 5-річному досвіду роботи з ARKit та сертифікації Apple Developer. Також ви можете замовити попередній аналіз вашого AR-застосунку.







