Конвертация 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 недели |
Стоимость рассчитывается в зависимости от объёма и исходных форматов.







