Стандарт задан IKEA Place, но сегодня пользователи требуют большего: мебель должна стоять строго горизонтально, корректно отбрасывать тени, реалистично взаимодействовать с освещением помещения и не проваливаться в пол на устройствах без LiDAR. Мы реализовали подобные проекты для заказчиков с каталогами до 1000 позиций — и знаем каждую деталь. Наш опыт 5+ лет и более 10 реализованных проектов гарантируют, что диван не провалится в пол, а шкаф станет ровно у стены.
Проблемы без LiDAR
На устройствах без LiDAR ARKit полагается только на монокулярную картинку. Погрешность обнаружения горизонтальных плоскостей может достигать 10 см, а occlusion объектов не работает — виртуальная мебель всегда рисуется поверх реальной. LiDAR решает обе проблемы: точность plane detection снижается до 2 см (в 5 раз точнее), и через sceneReconstruction включается корректное перекрытие. Вот сравнение:
| Параметр | Без LiDAR | С LiDAR |
|---|---|---|
| Точность плоскости | до 10 см | до 2 см |
| Occlusion | нет | да |
| Размещение при слабой текстуре | плохо | отлично |
| Время релокализации | 5-15 сек | 2-5 сек |
Точность plane detection в отсутствие LiDAR снижается в 5 раз, что критично для крупногабаритной мебели — шкаф может стоять с заметным наклоном.
Подготовка 3D-моделей для AR: типичные ошибки
Это часто недооцениваемая часть проекта. Каталог из 500 позиций, каждая из которых — GLTF с корректными PBR-материалами, правильными метаданными о реальном размере и точкой привязки строго на нижней плоскости объекта.
Типичные проблемы при получении моделей от клиента:
- Pivot point в центре объекта — стол летит в воздухе на высоту своего центра
- Масштаб в сантиметрах вместо метров — диван размером с кухню
- Текстуры в отдельных файлах (не embedded в GLB) — модель загружается без текстур
- Y-up vs Z-up несоответствие — стол лежит на боку
Конвертация и нормализация каталога через Blender Python API (batch script) или через Cesium ion / Sketchfab API — зависит от масштаба каталога. ARKit документация рекомендует придерживаться единой системы координат.
Подробнее о подготовке моделей
Для пакетной обработки 500+ файлов используется Blender Python API. Скрипт автоматически:
- Перемещает pivot point в центр нижней габаритной рамки
- Приводит масштаб к метрам (1 unit = 1 meter)
- Конвертирует текстуры в KTX2 для оптимальной загрузки
- Устанавливает правильную ориентацию осей (Y-up)
Результат — каталог в формате GLB, готовый к импорту в Xcode или Android Studio.
Размещение объекта: от raycast до стабильной позиции
Стандартный pipeline использует ARRaycastQuery, но для мебели есть специфика: объекты крупные, и пользователь хочет точно разместить не в центре комнаты, а у конкретной стены. Это значит:
- Обнаружение и горизонтальной, и вертикальной плоскости одновременно
- Snapping к стенам — объект «прилипает» на расстоянии 15 см от вертикальной плоскости
- Collision detection между объектами — два дивана не должны перекрываться
Collision detection в RealityKit — CollisionComponent с ShapeResource.generateBox(size:). ARView.scene.subscribe(to: CollisionEvents.Began.self) — событие столкновения. При пересечении — визуальная подсветка объекта красным и запрет размещения.
Как автоматизировать конвертацию 500 моделей?
Мы используем batch-скрипт на Blender Python API, который за час обрабатывает до 200 моделей. Это сокращает время подготовки каталога с недель до 2–3 дней. Экономия времени — до 70% по сравнению с ручной правкой каждой модели.
Реалистичное освещение: automatic vs ручное
ARWorldTrackingConfiguration.environmentTexturing = .automatic — ARKit строит HDR environment map из камеры. Это работает, но с задержкой: первые 5-10 секунд объект освещается некорректно. Для мебельного приложения, где пользователь видит объект сразу после размещения — это заметно.
Улучшение: AREnvironmentProbeAnchor с ручным размещением в центре комнаты. Позволяет принудительно обновить environment map по требованию (например, по кнопке «обновить освещение»).
Мультиобъектное размещение и сохранение сцены
Пользователь расставляет несколько предметов, хочет сохранить результат и вернуться позже. ARSession.getCurrentWorldMap(completionHandler:) — сохраняет состояние ARWorldMap с anchor'ами в Data. При следующем запуске: ARWorldTrackingConfiguration.initialWorldMap = savedMap, ARKit релокализуется и восстанавливает позиции объектов.
Работает только в том же помещении при достаточном освещении. Релокализация занимает 3-15 секунд.
Сравнение способов сохранения:
| Технология | Платформа | Время восстановления | Ограничения |
|---|---|---|---|
| ARWorldMap | iOS | 3–15 с | Только то же помещение |
| Cloud Anchors | iOS/Android | 5–30 с | Требуется интернет |
| Ручное сохранение позиций | Обе | Мгновенно | Нет привязки к реальному миру |
Скриншот результата для шаринга — ARView.snapshot(saveToHDR:completion:) + UIActivityViewController.
Что входит в работу
- Подготовка и конвертация 3D-моделей (до 500 позиций)
- Интеграция ARKit (iOS) / ARCore (Android) с plane detection, raycast, коллизиями
- Настройка LiDAR occlusion и scene reconstruction
- Реализация snapping к стенам и коллизий между объектами
- Сохранение и загрузка сцены (ARWorldMap / Cloud Anchors)
- Тестирование на 10+ реальных устройствах
- Публикация в App Store и Google Play (документация, метаданные)
- Обучение команды заказчика работе с инструментарием
Сроки
Базовое размещение одного объекта с plane detection — 5-7 дней. Мультиобъектное с collision, snapping к стенам, сохранением сцены — 3-5 недель. Поддержка LiDAR occlusion — плюс 1 неделя. Конвертация каталога моделей оценивается отдельно по объёму. Стоимость рассчитывается индивидуально по итогам анализа вашего каталога и технического задания. Свяжитесь с нами для детального обсуждения вашего проекта — мы подготовим техническое задание и коммерческое предложение. Получите консультацию прямо сейчас.







