Разработка AR-каталога товаров с 3D-моделями
AR-каталог — это когда пользователь выбирает диван на сайте и может поставить его в свою гостиную через телефон, не меняя страницу. Или выбирает кроссовки и примеряет на ноге. Разница между «посмотрел в каталоге» и «увидел у себя дома» — конверсия.
Технически это три связанных задачи: управление библиотекой 3D-моделей, AR-сцена с размещением и взаимодействием, интеграция с существующим каталогом/CMS.
Загрузка и управление 3D-ресурсами
AR-каталог с сотнями позиций не может хранить все модели в бандле приложения. Нужен on-demand download с CDN. Стандартный подход:
- Каталог товаров из CMS содержит
model_url— ссылку на USDZ (iOS) или GLB (Android) - При открытии карточки товара — проверяем локальный кэш (
FileManager) - Если нет — скачиваем в фоне через
URLSession.downloadTask, прогресс-бар - После загрузки — инициализируем AR-сцену
func loadModel(url: URL, completion: @escaping (ModelEntity?) -> Void) {
let cacheURL = cacheDirectory.appendingPathComponent(url.lastPathComponent)
if FileManager.default.fileExists(atPath: cacheURL.path) {
completion(try? ModelEntity.loadModel(contentsOf: cacheURL))
return
}
URLSession.shared.downloadTask(with: url) { tempURL, _, _ in
guard let tempURL else { completion(nil); return }
try? FileManager.default.moveItem(at: tempURL, to: cacheURL)
DispatchQueue.main.async {
completion(try? ModelEntity.loadModel(contentsOf: cacheURL))
}
}.resume()
}
Размер модели имеет значение. Мебель: 5–15 МБ USDZ — норма. 50+ МБ — пользователь ждёт и уходит. Оптимизация: TextureConverter для сжатия текстур в ASTC, Draco-сжатие геометрии (через usdz_converter или Blender pipeline).
AR-размещение: от плоскости до взаимодействия
Базовый plane detection → raycast → placement хорошо описан в документации ARKit. В AR-каталоге добавляется:
Масштабирование с сохранением реального размера. USDZ-модели должны иметь корректный масштаб: диван 2 метра длиной должен быть 2 метра в AR. Если размер в метаданных CMS есть — применяем через ModelEntity.scale. Если нет — задаём через конфигурацию модели. Пользователь не должен масштабировать сам — это разрушает ощущение «реального» размера.
Вращение одним пальцем. EntityRotationGestureRecognizer в RealityKit — самый простой путь. Но вращение только по оси Y (вертикальной): мебель не наклоняется, а поворачивается вокруг себя. Фиксируем ось через constraints:
entity.components[PhysicsMotionComponent.self] = PhysicsMotionComponent()
// Rotation constraint — только Y
Смена варианта/цвета без перезагрузки модели. Диван доступен в 5 цветах. Загружать 5 моделей — дорого. Правильно: одна геометрия, разные материалы. В USDZ материалы можно менять через ModelComponent.materials:
var materials = entity.model?.materials ?? []
materials[0] = SimpleMaterial(color: .init(selectedColor), isMetallic: false)
entity.model?.materials = materials
Для PBR-материалов с текстурами — PhysicallyBasedMaterial с загружаемыми текстурами.
Интеграция с каталогом
Типичный сценарий: Shopify, WooCommerce или кастомная CMS на бэкенде. Добавляем custom поле ar_model_url к товару. На мобильном клиенте — кнопка «Смотреть в AR» появляется только если поле заполнено.
Для управления 3D-контентом без программистов — простая CMS или admin panel с загрузкой USDZ/GLB файлов и автоматической оптимизацией через сервер (конвертация, сжатие, загрузка на CDN). Это убирает зависимость от разработчика при добавлении новых товаров.
Кейс из практики
Интернет-магазин мебели, 2000+ позиций. Приоритет: 100 топовых SKU покрыть AR-моделями. Этапность: сначала iOS (ARKit + USDZ), через 2 месяца — Android (SceneViewer + GLB). Конвертация из FBX-моделей поставщика в USDZ/GLB — автоматизированный пайплайн через Blender Python scripts + reality-converter CLI. Время обработки одной модели — 3–7 минут.
Главная нетехническая проблема: 3D-модели от поставщиков были в произвольных единицах (1 unit = 1 дюйм у одного, 1 сантиметр у другого). Написали скрипт нормализации масштаба с валидацией реальных размеров из спецификации товара.
Сроки
| Функциональность | Сроки |
|---|---|
| Базовый AR-viewer для одного товара | 1–2 недели |
| AR-каталог с кэшированием и вариантами цветов | 4–6 недель |
| Полная система с CMS, аналитикой и iOS+Android | 3–5 месяцев |
Стоимость рассчитывается индивидуально с учётом объёма каталога и необходимости конвертации моделей.







