Мы интегрируем Scene Reconstruction в AR-приложения, когда требуется точное взаимодействие с реальным окружением. Без LiDAR на устройствах (iPhone 12 Pro и новее, iPad Pro 2020+) реконструкция сцены невозможна — только детекция плоскостей. Типичная проблема: после интеграции ARKit с sceneReconstruction = .mesh приложение тормозит, потому что каждая вершина меша пересоздаётся каждый кадр. Мы решаем это, работая напрямую с Metal буферами и обновляя только изменившиеся анкоры. В одном проекте для склада мы обрабатывали до 30 000 вершин на кадр, сохраняя 60 FPS. Разберём технические детали.
Как устроена реконструкция сцены?
ARMeshAnchor накапливает геометрию комнаты в реальном времени. ARMeshGeometry хранит вершины, нормали и индексы треугольников. Обновляется через делегат session(_:didUpdate:) — каждый кадр ARKit может присылать десятки обновлённых анкоров. Наивная реализация, пересоздающая MeshResource на каждый update, убивает main thread за секунды. Правильный подход: обновляем меш только для изменившихся анкоров, используем MDLMesh как промежуточный формат и передаём данные в Metal буферы напрямую.
В 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. SceneKit не используем для меша — он не оптимизирован под динамические геометрии. Настройка сессии:
let config = ARWorldTrackingConfiguration()
config.sceneReconstruction = .meshWithClassification
arView.debugOptions = [.showSceneUnderstanding] // для отладки
arView.session.run(config)
Для визуализации меша в режиме отладки рисуем wireframe через arView.debugOptions. В продакшене видимость меша отключаем, но используем его данные для:
- Окклюзии — объекты за стенами не видны. Scene Reconstruction даёт в 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.
- Документация и обучение команды.
Процесс работы: от идеи до деплоя
- Аналитика — обсуждаем сценарии использования и определяем необходимые данные (окклюзия, навигация, физика).
- Проектирование — выбираем архитектуру (компонентная система, связка ARView и Metal).
- Реализация — пишем код на Swift, используем паттерн делегата для обновлений.
- Тестирование — проверяем на реальных устройствах в различных условиях (освещение, зеркала).
- Деплой — публикуем в App Store, настраиваем TestFlight для бета-тестеров.
Сроки и как начать
Базовая интеграция с визуализацией меша занимает 1–2 недели. Если нужны классификация поверхностей, физические коллизии и навигация на основе меша — 4–6 недель. Стоимость рассчитывается после детального обсуждения требований. Свяжитесь с нами для консультации — получите оценку вашего проекта. Также вы можете заказать предварительный анализ вашего AR-приложения.







