В A-Frame сущности (<a-entity>) представляют собой
базовые строительные блоки сцены. Каждая сущность может содержать
компоненты, определяющие её визуальные, физические или интерактивные
свойства. Динамическое создание сущностей позволяет добавлять объекты в
сцену во время выполнения, управлять их поведением и взаимодействием без
необходимости предварительного определения в HTML.
Для динамического добавления сущности используется метод
document.createElement:
const box = document.createElement('a-box');
box.setAttribute('position', '0 1 -3');
box.setAttribute('color', '#4CC3D9');
box.setAttribute('rotation', '0 45 0');
box.setAttribute('scale', '1 1 1');
document.querySelector('a-scene').appendChild(box);
Ключевые моменты:
createElement('a-box') создаёт сущность типа куб.setAttribute позволяет устанавливать положение, цвет,
размер, вращение и другие компоненты.appendChild добавляет сущность в сцену.Сущности могут быть любого типа: a-sphere,
a-cylinder, a-plane, a-light и
даже пользовательские компоненты.
Компоненты можно добавлять не только при создании, но и после:
box.setAttribute('animation', {
property: 'rotation',
to: '0 405 0',
loop: true,
dur: 5000
});
Это создаёт анимацию вращения куба. setAttribute
поддерживает как строковые значения, так и объектные записи с множеством
параметров.
Сущности могут содержать дочерние элементы, создавая иерархию объектов:
const parent = document.createElement('a-entity');
parent.setAttribute('position', '0 1 -5');
const child = document.createElement('a-sphere');
child.setAttribute('radius', '0.5');
child.setAttribute('color', '#EF2D5E');
parent.appendChild(child);
document.querySelector('a-scene').appendChild(parent);
Иерархия полезна для группирования объектов и совместного управления их позициями, масштабом или анимациями.
События привязываются с помощью метода
addEventListener:
box.addEventListener('click', () => {
box.setAttribute('color', '#FFC65D');
});
Можно использовать события mouseenter,
mouseleave, collide (при интеграции с
физикой), что позволяет строить интерактивные сцены без предварительной
разметки HTML.
Для генерации множества объектов удобно использовать циклы:
for (let i = 0; i < 10; i++) {
const sphere = document.createElement('a-sphere');
sphere.setAttribute('position', `${i} 1 -5`);
sphere.setAttribute('color', `hsl(${i * 36}, 100%, 50%)`);
document.querySelector('a-scene').appendChild(sphere);
}
Использование HSL позволяет создавать градиенты цветов автоматически. Циклы дают возможность создавать динамические ландшафты, облака объектов или случайные расстановки.
parent.removeChild(entity) для
снижения нагрузки.<a-entity> с дочерними объектами) и применять общие
трансформации, чтобы уменьшить количество операций на DOM.Все компоненты сущности можно менять во время выполнения:
box.setAttribute('position', '2 3 -5'); // перемещение
box.setAttribute('scale', '2 2 2'); // увеличение
box.setAttribute('material', 'opacity:0.5; transparent:true'); // прозрачность
Можно комбинировать анимацию и взаимодействие с событиями, создавая полностью динамические и реактивные сцены.
Для часто используемых динамических объектов удобно создавать собственные компоненты:
AFRAME.registerComponent('dynamic-box', {
schema: {
color: {type: 'string', default: '#4CC3D9'}
},
init: function () {
this.el.setAttribute('geometry', {primitive: 'box'});
this.el.setAttribute('material', {color: this.data.color});
this.el.setAttribute('position', '0 1 -3');
}
});
const customBox = document.createElement('a-entity');
customBox.setAttribute('dynamic-box', 'color: #FFC65D');
document.querySelector('a-scene').appendChild(customBox);
Это упрощает повторное создание объектов с одинаковыми свойствами и логикой.
Динамические сущности часто создаются по таймеру или в ответ на события:
setInterval(() => {
const cube = document.createElement('a-box');
cube.setAttribute('position', `${Math.random()*4 - 2} 2 ${Math.random()*-5}`);
cube.setAttribute('color', `hsl(${Math.random()*360}, 100%, 50%)`);
document.querySelector('a-scene').appendChild(cube);
}, 1000);
Так можно создавать падающие объекты, случайные эффекты или реагирующие на пользовательские действия элементы сцены.
Динамическое создание сущностей в A-Frame — это мощный инструмент для построения интерактивных 3D-сцен. Оно позволяет:
Гибкое управление сущностями через JavaScript обеспечивает высокий уровень интерактивности и масштабируемости 3D-приложений.