Реалізація AR-розміщення 3D-об'єктів на площині
Ми в TrueTech регулярно вирішуємо цю задачу для замовників з меблевого та ритейл-сектору. Поставити 3D-модель на виявлену площину стабільно — не один вечір роботи. Об'єкт має стояти рівно при русі камери, не «пливти» при зміні освітлення, адекватно масштабуватися і не потопати в поверхні. Ми пропонуємо реалізацію під ключ: від підбору формату моделі до фінальної інтеграції у ваш застосунок. В одному з проєктів для меблевого ритейлу ми зіткнулися з проблемою «провалювання» об'єкта в площину при швидкому русі камери. Рішенням стало використання ARAnchor з динамічним зміщенням по нормалі на 2 мм — це виключило Z-боротьбу при будь-якому освітленні.
Формати 3D-моделей та оптимізація для AR
Стандарт для мобільного AR — USDZ (iOS/RealityKit) та GLB/GLTF (ARCore/крос-платформенно). Типова помилка: брати модель без оптимізації і намагатися завантажити її в AR. Полігональність 500k трикутників, текстури 4096×4096 без mip-mapping — гарантований FPS провал на пристроях до A13.
Цільові параметри для мобільного AR:
| Тип об'єкта | Полігони | Текстури | Розмір GLB |
|---|---|---|---|
| Невеликий предмет (стілець, світильник) | до 30k | 1024×1024 | до 5 МБ |
| Середній об'єкт (диван, стіл) | до 80k | 2048×2048 | до 15 МБ |
| Великий (комплект меблів, кухня) | до 200k | 2048×2048 | до 40 МБ |
Компресія: KTX2 + Basis Universal для GLB, HEIC-текстури в USDZ. У RealityKit — Reality Composer Pro (Xcode 15+) для запікання PBR-матеріалів прямо в .reality формат. Для Android використовуйте Android Studio з ARCore SDK 1.30+ для конвертації GLB.
Чому Raycast кращий за hitTest для розміщення?
З ARKit 4+ та ARCore 1.18+ кращий метод визначення точки розміщення — Raycast. Він повертає ARRaycastResult з target: .existingPlaneGeometry або .estimatedPlane. existingPlaneGeometry використовує вже детектовану геометрію — точність у 2 рази вища, ніж у застарілого hitTest. Apple рекомендує raycast як основний метод (див. документацію ARKit). Більше того, hitTest був оголошений застарілим в iOS 14, і його використання може призвести до відхилення застосунку через вимоги App Store Review Guidelines (розділ 4.2: мінімальна функціональність).
Приклад на Swift:
let query = arView.makeRaycastQuery(
from: arView.center,
allowing: .existingPlaneGeometry,
alignment: .horizontal
)
let results = arView.session.raycast(query)
if let first = results.first {
placeEntity(at: first.worldTransform)
}
Для ARCore — Session.createRaycastQuery() + Frame.raycast() дає більш стабільний результат на краях площин.
Як стабілізувати об'єкт після розміщення?
Після першого розміщення об'єкт не повинен «гуляти» при русі камери. Стандартний підхід — прив'язка до AnchorEntity через ARAnchor:
let anchor = ARAnchor(transform: worldTransform)
arView.session.add(anchor: anchor)
let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(modelEntity)
arView.scene.addAnchor(anchorEntity)
Явний ARAnchor фіксує позицію, і об'єкт не оновлюється разом з уточненням площини. Без цього він зміщується перші 10–15 секунд сесії, поки ARKit уточнює геометрію. Додатково можна застосувати фільтрацію Калмана до позиції якоря, якщо об'єкт все ж тремтить.
Тіні та фізичне освітлення
AR-об'єкт без тіні виглядає «літаючим». У RealityKit тінь створюється встановленням castsShadow = true у entity — contact shadow рендериться автоматично. У SceneKit для цього потрібен directional light з castsShadow = true. Важно: при використанні environment texturing (ARKit, A12+) об'єкти отримують відбиття реального оточення. Металеві поверхні відбивають інтер'єр — без цього хромований предмет виглядає пластиковим. Увімкніть environmentTexturing = .automatic у ARWorldTrackingConfiguration.
Які жести підтримуються для маніпуляції об'єктом?
Після розміщення користувач повинен мати можливість переміщати, обертати та масштабувати об'єкт. У RealityKit жести додаються в один рядок:
arView.installGestures([.translation, .rotation, .scale], for: entity)
Для кастомного управління використовуйте UILongPressGestureRecognizer з безперервним raycast — це дає більший контроль над чутливістю. При реалізації обертання обов'язково обмежте вісь Y: використовуйте simd_quatf(angle:axis:) лише навколо вертикальної осі, інакше об'єкт «завалюється» при неточному жесті. На Android аналогічно: GestureRecognizer з Sceneform або ArGestureRecognizer в ARCore.
Як тестувати AR-розміщення на різних пристроях?
Критично протестувати на кількох поколіннях iPhone та Android-пристроїв. Наприклад, на iPhone XR (A12) raycast працює стабільно, але environment texturing споживає додаткову пам'ять — може просідати FPS при високополігональних моделях. Рекомендуємо використовувати TestFlight для iOS і внутрішнє тестування Google Play для Android — це дозволяє виявити проблеми з глибиною (Z-fighting) на різних версіях ARCore.
Що входить в роботу
| Етап | Результат |
|---|---|
| Аналіз моделі та вимог | Вибір формату, оптимізація полігонів і текстур |
| Розробка розміщення | Raycast, anchor, стабілізація, тіні |
| Реалізація жестів | Переміщення, обертання, масштабування |
| Тестування на пристроях | Перевірка стабільності на різних версіях iOS/Android |
| Інтеграція в застосунок | Документація, доступ до репозиторію, навчання команди |
Наш досвід — понад 20 успішних проєктів у мобільній AR-розробці. Зв'яжіться з нами для оцінки вашого проєкту — реалізуємо під ключ за 2–3 тижні. Отримайте консультацію без зобов'язань.







