Реализация AR-примерки мебели в интерьере
IKEA Place сделала этот сценарий массовым в 2017-м — с тех пор ожидания пользователей выросли. «Просто поставить модель» уже недостаточно: мебель должна стоять строго горизонтально на обнаруженном полу, корректно отбрасывать тени, реалистично взаимодействовать с освещением помещения и не «проваливаться» в пол на iPhone без LiDAR.
Подготовка 3D-моделей мебели
Это часто недооцениваемая часть проекта. Каталог из 500 позиций, каждая из которых — GLTF с корректными PBR-материалами, правильными метаданными о реальном размере и точкой привязки строго на нижней плоскости объекта.
Типичные проблемы при получении моделей от клиента:
- Pivot point в центре объекта — стол летит в воздухе на высоту своего центра
- Масштаб в сантиметрах вместо метров — диван размером с кухню
- Текстуры в отдельных файлах (не embedded в GLB) — модель загружается без текстур
- Y-up vs Z-up несоответствие — стол лежит на боку
Конвертация и нормализация каталога через Blender Python API (batch script) или через Cesium ion / Sketchfab API — зависит от масштаба каталога.
Размещение объекта: от raycast до стабильной позиции
Стандартный pipeline уже описан в задаче 514, но для мебели есть специфика: объекты крупные, и пользователь хочет точно разместить не в центре комнаты, а у конкретной стены. Это значит:
- Обнаружение и горизонтальной, и вертикальной плоскости одновременно
- Snapping к стенам — объект «прилипает» на расстоянии 15 см от вертикальной плоскости
- Collision detection между объектами — два дивана не должны перекрываться
Collision detection в RealityKit — CollisionComponent с ShapeResource.generateBox(size:). ARView.scene.subscribe(to: CollisionEvents.Began.self) — событие столкновения. При пересечении — визуальная подсветка объекта красным и запрет размещения.
LiDAR: occlusion и реалистичное взаимодействие с пространством
На устройствах с LiDAR (iPhone 12 Pro+, iPad Pro) включаем ARWorldTrackingConfiguration.sceneReconstruction = .meshWithClassification. ARKit строит плотный меш окружения с классификацией поверхностей (wall, floor, ceiling, furniture, door, window).
Два применения для примерки мебели:
Occlusion (перекрытие): реальная мебель перекрывает виртуальный диван, когда пользователь заходит за него. Включается через ARView.environment.sceneUnderstanding.options = [.occlusion]. Без LiDAR — нет корректного occlusion, объект всегда поверх всего.
Размещение без видимого пола: пользователь хочет поставить полку, но пол перекрыт ковром с нейтральной текстурой — SLAM плохо определяет. LiDAR-меш пола строится независимо от текстуры — размещение работает.
Освещение интерьера
ARWorldTrackingConfiguration.environmentTexturing = .automatic — ARKit строит HDR environment map из камеры. Это работает, но с задержкой: первые 5-10 секунд объект освещается некорректно. Для мебельного приложения, где пользователь видит объект сразу после размещения — это заметно.
Улучшение: AREnvironmentProbeAnchor с ручным размещением в центре комнаты. Позволяет принудительно обновить environment map по требованию (например, по кнопке «обновить освещение»).
Мультиобъектное размещение и сохранение сцены
Пользователь расставляет несколько предметов, хочет сохранить результат и вернуться позже. ARSession.getCurrentWorldMap(completionHandler:) — сохраняет состояние ARWorldMap с anchor'ами в Data. При следующем запуске: ARWorldTrackingConfiguration.initialWorldMap = savedMap, ARKit релокализуется и восстанавливает позиции объектов.
Работает только в том же помещении при достаточном освещении. Релокализация занимает 3-15 секунд.
Скриншот результата для шаринга — ARView.snapshot(saveToHDR:completion:) + UIActivityViewController.
Сроки
Базовое размещение одного объекта с plane detection — 5-7 дней. Мультиобъектное с collision, snapping к стенам, сохранением сцены — 3-5 недель. Поддержка LiDAR occlusion — плюс 1 неделя. Конвертация каталога моделей — оценивается отдельно по объёму. Стоимость рассчитывается индивидуально.







