Конвертація 3D-моделей у формат GLB/GLTF для Android AR
GLB — бінарний контейнер формату glTF 2.0, стандарт Khronos Group. ARCore, Sceneform, model-viewer, WebXR — всі використовують glTF/GLB. На відміну від USDZ, GLB працює кросс-платформенно: Android AR, WebAR, Three.js, Babylon.js, Unity, Unreal.
Але «відкритий стандарт» не означає «все просто конвертується без проблем».
Структура GLB і вимоги для AR
glTF 2.0 описує сцену через JSON: меші, матеріали (PBR metallic-roughness workflow), анімації, скини, камери, світло. GLB упаковує JSON + бінарні дані (геометрія, анімації) + текстури в один файл.
Обов'язкові вимоги для Android ARCore / Sceneform:
- Матеріали лише через
pbrMetallicRoughness— Blinn-Phong, Phong, Lambert не підтримуються - Текстури: PNG (з alpha) або JPEG (без alpha), max 2048×2048
- Геометрія: лише трикутники (
TRIANGLESprimitive mode), не quads - Без нереференсованих нодів та матеріалів (валідатор ругається)
-
asset.generator— бажано встановлювати (допомагає при дебагуванні сумісності)
Конвертація з основних форматів
FBX → GLB. Blender — найкращий проміжний конвертер:
blender --background --python fbx_to_glb.py -- input.fbx output.glb
Python-скрипт для Blender:
import bpy
bpy.ops.import_scene.fbx(filepath=input_path)
bpy.ops.export_scene.gltf(
filepath=output_path,
export_format='GLB',
export_materials='EXPORT',
export_animations=True,
export_apply=True # застосовує модифікатори
)
Головна проблема FBX → GLB через Blender: матеріали FBX часто використовують Standard або Lambert шейдери — Blender конвертує їх у Principled BSDF, але параметри (specular, shininess) маппяться приблизно. Результат потрібно перевіряти візуально.
OBJ → GLB. OBJ не підтримує анімацію, PBR-матеріали (лише MTL з Kd/Ks), скини. Для статичних об'єктів — конвертація через Blender або obj2gltf:
obj2gltf -i model.obj -o model.glb
MTL-файл маппиться в glTF pbrMetallicRoughness приблизно: Kd → baseColorFactor, map_Kd → baseColorTexture. Карти normal, roughness, metallic із MTL не підхоплюються — потрібно додавати вручну через glTF-пайплайн.
USDZ → GLB (iOS → Android). Apple Reality Converter може експортувати в USD/OBJ, потім через Blender у GLB. Прямого конвертера USDZ→GLB немає — обов'язковий проміжний крок через USD Python API або Blender.
Оптимізація GLB для мобільного AR
Draco-стиснення. Стискає геометрію на 60–90% без видимої втрати якості:
npx gltf-pipeline -i model.glb -o model_draco.glb --draco.compressionLevel 7
Важливо: ARCore підтримує Draco. Старі версії Three.js без DracoLoader — ні. Перевіряємо сумісність з цільовим рендерером.
KTX2/Basis Universal текстури. GPU-сжаті текстури, завантажуються швидше та займають менше VRAM:
npx gltf-transform etc1s model.glb model_ktx2.glb
# або toktx для створення KTX2 файлів окремо
Basis Universal декодується на GPU — не потрібно розпаковувати в RAM. На Android AR знижує потребування пам'яті на 40–60% для текстурованих моделей.
Mesh quantization. Упакування float32 координат вершин в int16 — втрата точності < 0,01%, виграш по розміру 25–40%:
npx gltf-transform quantize model.glb model_quantized.glb
Валідація
glTF Validator від Khronos — обов'язковий перед деплоєм:
npx gltf-validator model.glb
Видає помилки та попередження з кодами. Коди типу ACCESSOR_ELEMENT_OUT_OF_MIN_BOUND — плаваючі значення поза допустимим діапазоном, часто із FBX-конвертації.
model-viewer (Google) — браузерний переглядач glTF, показує модель як в ARCore. Ідеальний для швидкої перевірки перед установкою на пристрій.
Типові помилки
- Модель без UV-розгортки — в ARCore біла або сіра
- Double-sided матеріали не вказані явно (
doubleSided: trueу JSON) — внутрішні грані невидимі - Координати у дюймах/сантиметрах замість метрів — об'єкт в AR мікроскопічний або гігантський
- Анімація з non-linear interpolation — у glTF лише LINEAR та STEP/CUBICSPLINE
Терміни
| Обсяг | Терміни |
|---|---|
| 1–10 моделей з ручною конвертацією та перевіркою | 1–3 дні |
| Автоматизований пайплайн FBX/OBJ → GLB | 1 тиждень |
| Пакет 50–200 моделей з оптимізацією та валідацією | 2–3 тижні |
Вартість розраховується залежно від обсягу та вихідних форматів.







