Реалізація AR-примерки меблів у інтер'єрі
IKEA Place зробила цей сценарій масовим у 2017-му — з тих пір очікування користувачів виросли. «Просто поставити модель» вже недостатньо: меблі повинні стояти строго горизонтально на виявленій підлозі, коректно відбивати тіні, реалістично взаємодіяти з освітленням приміщення та не «проваліватися» в пол на iPhone без LiDAR.
Підготовка 3D-моделей меблів
Це часто недооцінювана частина проекту. Каталог з 500 позицій, кожна з яких — GLTF з коректними PBR-матеріалами, правильними метаданими про реальний розмір та точкою привязки строго на нижній площині об'єкта.
Типові проблеми при отриманні моделей від клієнта:
- Pivot point у центрі об'єкта — стіл летить на висоту свого центра
- Масштаб у сантиметрах замість метрів — диван розміром з кухню
- Текстури в окремих файлах (не embedded в GLB) — модель завантажується без текстур
- Y-up проти 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: окклюзія та реалістична взаємодія з простором
На пристроях з LiDAR (iPhone 12 Pro+, iPad Pro) вмикаємо ARWorldTrackingConfiguration.sceneReconstruction = .meshWithClassification. ARKit будує dense меш оточення з класифікацією поверхонь (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 тиждень. Конвертація каталогу моделей — оцінюється окремо за обсягом. Вартість розраховується індивідуально.







