Современная веб-графика требует эффективных способов передачи сложных 3D-сцен через сеть. Одним из ключевых стандартов для этой задачи стал формат glTF (GL Transmission Format). Он был разработан организацией Khronos Group как универсальный контейнер для передачи 3D-моделей, материалов, текстур, анимаций и иерархий сцены.
В среде Three.js glTF является одним из основных форматов импорта благодаря следующим свойствам:
Формат представлен в двух основных вариантах:
.gltf — текстовый JSON-файл с внешними
ресурсами.glb — бинарный контейнер,
объединяющий всё в одном файлеОба формата содержат одинаковую логическую структуру, но различаются способом хранения данных.
Файл gltf представляет собой JSON-документ, описывающий структуру сцены. Внутри содержатся ссылки на внешние ресурсы: буферы, текстуры и шейдерные данные.
Типичная структура:
model/
├── scene.gltf
├── scene.bin
├── texture_basecolor.png
├── texture_normal.png
Scene
Определяет набор объектов, входящих в сцену.
Nodes
Формируют иерархию объектов.
Meshes
Геометрия моделей.
Buffers
Двоичные массивы вершин, нормалей, UV-координат.
Materials
Описание PBR-материалов.
Textures
Изображения, используемые материалами.
Пример фрагмента JSON:
{
"asset": {
"version": "2.0"
},
"scenes": [
{ "nodes": [0] }
],
"nodes": [
{ "mesh": 0 }
]
}
JSON-структура делает формат читаемым и удобным для анализа.
В Three.js загрузка осуществляется через GLTFLoader, входящий в набор дополнительных модулей.
Импорт загрузчика:
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
Создание загрузчика:
const loader = new GLTFLoader();
Загрузка модели:
loader.load(
'models/scene.gltf',
function (gltf) {
scene.add(gltf.scene);
},
undefined,
function (error) {
console.error(error);
}
);
После загрузки объект gltf содержит:
scene — корневую сценуscenes — список сценanimations — анимацииcamerasassetДобавление gltf.scene в сцену Three.js отображает
модель.
Текстовый вариант glTF использует раздельное хранение ресурсов.
1. Читаемость
JSON легко анализировать и редактировать.
2. Гибкость
Возможно заменять текстуры без пересборки модели.
3. Удобство отладки
Файл можно открыть в любом редакторе.
4. Кэширование браузером
Текстуры могут кэшироваться независимо.
1. Большое количество файлов
Модель может состоять из десятков ресурсов.
2. Дополнительные HTTP-запросы
Каждая текстура требует отдельной загрузки.
3. Сложность деплоя
Все файлы должны находиться в корректных путях.
Файл GLB представляет собой бинарную версию glTF, в которой все ресурсы объединены в один контейнер.
Структура:
model.glb
Внутри файла находятся:
Контейнер состоит из нескольких блоков:
| Блок | Назначение |
|---|---|
| Header | метаданные файла |
| JSON Chunk | описание сцены |
| Binary Chunk | геометрия и текстуры |
Файл имеет расширение .glb, но логическая структура
полностью соответствует glTF.
GLB загружается тем же GLTFLoader, поскольку оба формата поддерживаются одинаково.
loader.load(
'models/model.glb',
function (gltf) {
scene.add(gltf.scene);
}
);
Для загрузчика разница между .gltf и .glb
отсутствует — обработка выполняется автоматически.
Все данные объединены.
Это упрощает:
Отсутствуют дополнительные HTTP-запросы.
Это особенно важно для:
В glTF нередко возникают ошибки:
404 texture not found
GLB полностью исключает такие проблемы.
Один файл проще:
Бинарный файл невозможно удобно редактировать вручную.
Для изменения модели требуется повторный экспорт из 3D-редактора.
Браузер не может кэшировать текстуры отдельно.
Если изменена одна текстура — перезагружается весь файл.
В системах контроля версий бинарные файлы плохо отображают изменения.
| Характеристика | glTF | GLB |
|---|---|---|
| Формат | JSON | бинарный |
| Количество файлов | несколько | один |
| Читаемость | высокая | отсутствует |
| Размер | немного больше | компактнее |
| HTTP-запросы | несколько | один |
| Удобство отладки | высокое | низкое |
Текстовый формат удобен в следующих случаях:
Разработка
Во время разработки модели часто меняются текстуры и материалы.
Отладка
При необходимости анализа структуры сцены.
Пайплайн производства
Если модель проходит через несколько этапов обработки.
Инструментальная обработка
Когда требуется программно модифицировать JSON.
GLB предпочтителен в production-среде.
Типичные сценарии:
Основная причина — минимизация сетевых запросов.
Большинство редакторов поддерживает экспорт glTF.
Наиболее распространённый инструмент — Blender.
Экспорт выполняется через:
File → Export → glTF 2.0
Доступные режимы:
| Режим | Описание |
|---|---|
| glTF Separate | отдельные файлы |
| glTF Embedded | текстуры внутри JSON |
| GLB | бинарный контейнер |
Рекомендуемые настройки для веб-приложений:
Для уменьшения размера glTF/GLB используются расширения.
Сжимает геометрию.
Размер модели может уменьшиться в 5–10 раз.
Подключение в Three.js:
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath('/draco/');
loader.setDRACOLoader(dracoLoader);
Современная альтернатива Draco.
Преимущества:
В glTF текстуры могут храниться несколькими способами.
texture.png
Наиболее распространённый вариант.
Текстура кодируется внутри JSON.
Пример:
data:image/png;base64,iVBOR...
Недостатки:
Текстуры включаются в бинарный блок.
Это наиболее эффективный способ.
Формат влияет на несколько аспектов работы приложения.
GLB загружается быстрее благодаря одному запросу.
GLB требует меньше операций парсинга.
glTF лучше кэшируется по частям.
Разницы между форматами нет — после загрузки текстуры одинаково передаются в WebGL.
Практика разработки Three.js показывает несколько эффективных подходов.
Для production-версии
Для разработки
Для крупных сцен
Three.js позволяет загружать модели только при необходимости.
Пример:
function loadModel() {
loader.load('models/car.glb', (gltf) => {
scene.add(gltf.scene);
});
}
Такая стратегия уменьшает время начальной загрузки страницы.
Несколько ключевых методов оптимизации:
1. Уменьшение текстур
2. Удаление лишних вершин
Оптимизация сетки в 3D-редакторе.
3. Использование compression
Draco или Meshopt.
4. Удаление невидимых объектов
Например:
GLB и glTF одинаково поддерживают анимации.
Анимации доступны через:
gltf.animations
Запуск анимации:
const mixer = new THREE.AnimationMixer(gltf.scene);
const action = mixer.clipAction(gltf.animations[0]);
action.play();
Это позволяет использовать:
Формат поддерживает систему расширений.
Некоторые важные расширения:
| Расширение | Назначение |
|---|---|
| KHR_materials_clearcoat | прозрачные покрытия |
| KHR_texture_transform | трансформации UV |
| KHR_lights_punctual | источники света |
| KHR_draco_mesh_compression | сжатие геометрии |
Three.js автоматически поддерживает большинство популярных расширений.
Типичная структура проекта:
project/
├── index.html
├── js/
│ └── app.js
└── models/
└── model.glb
Загрузка выполняется через относительный путь:
models/model.glb
Для production-проекта модели часто размещаются на CDN.
GLB удобно распространять через CDN-сети:
Преимущества:
Для анализа glTF/GLB используются специальные инструменты:
glTF Viewer
Позволяет визуально проверить модель.
gltf.report
Показывает:
Это помогает оптимизировать модели перед публикацией.
Формат glTF стал фактическим стандартом для передачи 3D-контента в вебе. Он широко используется в:
Бинарный вариант GLB обеспечивает компактность и простоту распространения, тогда как glTF остаётся удобным форматом для разработки и анализа структуры сцены.