Оптимізація 3D-моделей для AR (LOD, текстури, кількість полігонів)
3D-художник здав модель крісла — 1,2 мільйона полігонів, текстури 8192×8192 PNG. У Cinema 4D рендер виглядає чудово. У AR на iPhone — 18 FPS з перегріванням за 3 хвилини. Проблема не в застосунку або ARKit. Модель не підготована для рендеринга на мобільному GPU.
Кількість полігонів: скільки насправді потрібно
На типовій відстані перегляду AR 0,5–3 метри деталізація вище 100–150K полігонів візуально невідрізима від 50K. Практичне правило:
| Розмір об'єкта | Рекомендована кількість полігонів | Відстань перегляду |
|---|---|---|
| Малий (чашка, телефон) | 5000–15000 | 0,3–1 м |
| Середній (крісло, лампа) | 15000–50000 | 0,5–2 м |
| Великий (диван, шафа) | 30000–80000 | 1–3 м |
| Дуже великий (автомобіль) | 50000–120000 | 2–10 м |
Decimate в Blender: Modifier → Decimate → Collapse з Ratio = 0,05–0,1 для складних моделей дає гарні результати без ручної ретопології. Quadric Edge Collapse Decimation краще зберігає форму країв, ніж Unsubdivide.
Після децимації — обов'язкове тестування в AR на цільовому пристрої, не лише в попередньому перегляді редактора. Силует об'єкта важливіший за внутрішні деталі. Ми декодуємо їх інакше.
Текстури: формати та розміри
Найбільший вплив на продуктивність йде від текстур, а не від кількості полігонів.
ASTC (Adaptive Scalable Texture Compression) — правильний формат для мобільного AR. Підтримується всіма ARM Mali та Qualcomm Adreno GPU з 2014+ року. ASTC 6×6 досягає приблизно 2,37 bpp порівняно з 32 bpp для PNG — у 13 разів менше GPU-пам'яті з мінімальною втратою якості.
ETC2 — універсальний fallback для старих пристроїв (GLES 3.0+). Гірша якість стиснення ніж ASTC, але ширша підтримка.
Ніколи не використовуйте PNG/JPEG у текстурах AR-сцени. PNG декодується у повний RGBA8888 — для текстури 2048×2048 це 16 МБ GPU-пам'яті. ASTC 2048×2048 — близько 2 МБ.
Генеруйте ASTC через astcenc (командний рядок):
astcenc -cl input.png output.astc 6x6 -medium
У Xcode Asset Catalog: додайте текстуру, встановіть Compression = Lossy → автоматичний ASTC на iOS. На Android — компіляція через Android Studio або CI через texturetool.
Розмір текстури. Правило: розмір текстури пропорційний видимій площі об'єкта на екрані. Для об'єкта, що займає 20% екрана — текстура 512×512 дає невідрізимі результати від 2048×2048. Mipmap обов'язковий: SceneKit та ARCore автоматично використовують рівень mipmap, що відповідає розміру відображення.
LOD для AR
На відміну від ігрових движків, ARKit SceneKit не має вбудованого LOD-менеджера. Реалізуйте через SCNLevelOfDetail:
let highPolyGeometry = loadGeometry("chair_high.usdz") // 50K полігонів
let medPolyGeometry = loadGeometry("chair_med.usdz") // 15K полігонів
let lowPolyGeometry = loadGeometry("chair_low.usdz") // 5K полігонів
let lod1 = SCNLevelOfDetail(geometry: medPolyGeometry, screenSpaceRadius: 100)
let lod2 = SCNLevelOfDetail(geometry: lowPolyGeometry, screenSpaceRadius: 30)
node.geometry?.levelsOfDetail = [lod1, lod2]
screenSpaceRadius — радіус bounding sphere в пікселях екрана. При 100, модель займає близько 200×200 пікселів. Значення емпірично налаштовуються для кожного об'єкта.
На Android ARCore з Filament LOD реалізується через swap MaterialInstance або RenderableManager.Builder.boundingBox() для culling.
USDZ / glTF: правильний формат для AR
USDZ (iOS, macOS) — контейнер, заснований на OpenUSD від Pixar. Містить геометрію, матеріали, анімації, фізику. Підтримує AR Quick Look без коду. Reality Converter (macOS-застосунок від Apple) конвертує з FBX/OBJ/glTF в USDZ з одночасною оптимізацією текстур.
glTF 2.0 (Android/Cross-platform) — відкритий стандарт, нативно підтримується Filament та Sceneform. glb — бінарний варіант, бажаний для AR (один файл замість багатьох). Оптимізуйте через gltf-pipeline:
gltf-pipeline -i model.gltf -o model_opt.glb \
--draco.compressMeshes --draco.quantizePositionBits 14
Draco-стиснення (Google) зменшує розмір геометрії у 5–10 разів через стиснення з втратами. Якість контролюється через quantizeBits — 14 бітів достатньо для більшості AR-об'єктів.
Терміни
Оптимізація однієї 3D-моделі (децимація + текстури + LOD) — 0,5–1 день. Пакетна оптимізація 20–50 моделей — 1–2 тижні з налаштуванням автоматизації пайплайну.







