Компонент gltf-model в A-Frame используется для загрузки
и отображения 3D-моделей в формате GLTF или GLB. Он является ключевым
инструментом для интеграции готовых моделей в сцены виртуальной и
дополненной реальности. Формат GLTF (GL Transmission Format)
оптимизирован для веба: он поддерживает материалы PBR, анимации,
текстуры и сложные иерархии объектов, что делает его стандартом де-факто
для веб-3D.
Синтаксис базового использования:
<a-entity gltf-model="#model"></a-entity>
Здесь #model — это идентификатор ресурса, определённого
через тег <a-asset-item>:
<a-assets>
<a-asset-item id="model" src="models/car.glb"></a-asset-item>
</a-assets>
gltf-model автоматически загружает модель и добавляет её
в сцену как дочерний объект THREE.Group внутри сущности
A-Frame.
1. src Основной атрибут, указывающий
путь к файлу модели. Поддерживаются локальные и удалённые ресурсы:
<a-entity gltf-model="src: url(models/house.glb)"></a-entity>
2. draco-compression Используется для
декодирования моделей, сжатых через Draco. Пример:
<a-entity gltf-model="src: url(model-draco.glb); draco-compression: true"></a-entity>
Необходимо подключать декодер Draco через
<script>.
3. animation-mixer Позволяет
проигрывать анимации, встроенные в модель. Атрибут принимает параметры
для управления действиями и скоростью воспроизведения:
<a-entity gltf-model="#animatedModel" animation-mixer="clip: Run; loop: repeat"></a-entity>
Компонент gltf-model генерирует ряд событий:
model-loaded — срабатывает после полной загрузки модели
и её интеграции в сцену.model-error — вызывается при ошибке загрузки.model-progress — предоставляет данные о прогрессе
загрузки, полезно для отображения индикаторов.Пример подписки на событие:
const entity = document.querySelector('#carEntity');
entity.addEventListener('model-loaded', () => {
console.log('Модель загружена');
});
После загрузки модели можно управлять её материалами через компонент
material или напрямую через объект THREE:
entity.addEventListener('model-loaded', () => {
const mesh = entity.getObject3D('mesh');
if (mesh) {
mesh.traverse((node) => {
if (node.isMesh) {
node.material.color.set('red');
}
});
}
});
Метод traverse позволяет проходить по всем дочерним
мешам модели, что особенно важно для сложных GLTF-сцен с несколькими
материалами.
Модели GLTF могут быть тяжелыми, поэтому рекомендуется:
<a-assets> для
кэширования и предотвращения “подвисаний” сцены.1. Динамическая подгрузка модели по URL:
const entity = document.createElement('a-entity');
entity.setAttribute('gltf-model', 'url(https://example.com/models/robot.glb)');
document.querySelector('a-scene').appendChild(entity);
2. Анимация с несколькими клипами:
<a-entity gltf-model="#character" animation-mixer="clip: Walk; loop: repeat">
</a-entity>
<a-entity gltf-model="#character" animation-mixer="clip: Jump; loop: once">
</a-entity>
3. Смешивание материалов после загрузки:
entity.addEventListener('model-loaded', () => {
const mesh = entity.getObject3D('mesh');
mesh.traverse((node) => {
if (node.isMesh) {
node.material.emissiveIntensity = 0.5;
node.material.roughness = 0.8;
}
});
});
gltf-model часто используется совместно с:
animation-mixer для анимаций персонажей.physics-body и dynamic-body (из
aframe-physics-system) для физического взаимодействия.cursor и raycaster для интерактивности с
3D-объектами.Сценарии могут включать игровые объекты, архитектурные визуализации, VR-презентации и обучающие симуляторы, где GLTF обеспечивает высокое качество рендеринга при сравнительно лёгком весе файла.
Хотя компонент gltf-model выглядит просто, глубокое
понимание его событийной системы, структуры загружаемых объектов и
взаимодействия с другими компонентами позволяет создавать динамичные и
оптимизированные 3D-сцены в браузере.