В A-Frame каждый объект сцены представлен сущностью
(), которая может содержать один или
несколько компонентов. Компонент — это модуль,
описывающий поведение, внешний вид или взаимодействие объекта.
Компоненты могут быть встроенными (geometry,
material, position, rotation) или
пользовательскими, созданными через API A-Frame.
Каждый компонент имеет набор атрибутов, которые
задают его свойства. Например, компонент geometry имеет
атрибуты primitive, height,
width, depth, а material —
color, opacity, shader.
Правильный маппинг атрибутов на компоненты позволяет управлять объектами
сцены эффективно и динамически.
В этом примере атрибуты width, height и
depth относятся к компоненту geometry, а
color и opacity — к material.
Атрибут position принадлежит одноименному компоненту,
встроенному в систему A-Frame.
Атрибуты компонентов могут задаваться в двух форматах:
;:
Каждый атрибут представлен как ключ: значение. Важно
соблюдать точку с запятой как разделитель между
атрибутами. Пробелы после точки с запятой не обязательны, но улучшают
читаемость.
Компоненты и их атрибуты можно изменять в рантайме с помощью методов
setAttribute и getAttribute.
// Получение элемента сцены
const box = document.querySelector('#box');
// Изменение цвета материала
box.setAttribute('material', 'color', 'blue');
// Изменение размеров геометрии
box.setAttribute('geometry', {
width: 3,
height: 2,
depth: 1
});
// Чтение текущих значений
const materialColor = box.getAttribute('material').color;
Метод setAttribute поддерживает как строковый
синтаксис, так и объектный формат.
Использование объекта позволяет задавать несколько атрибутов
одновременно, что особенно удобно для компонентов с большим числом
параметров.
Создание собственного компонента осуществляется через
AFRAME.registerComponent. Компонент может содержать
схему атрибутов, методы init,
update, tick и remove. Схема
определяет типы данных, значения по умолчанию и
описание.
AFRAME.registerComponent('spin', {
schema: {
speed: {type: 'number', default: 1},
axis: {type: 'string', default: 'y'}
},
tick: function (time, timeDelta) {
const rotation = this.el.getAttribute('rotation');
if (this.data.axis === 'x') rotation.x += this.data.speed * timeDelta / 1000;
if (this.data.axis === 'y') rotation.y += this.data.speed * timeDelta / 1000;
if (this.data.axis === 'z') rotation.z += this.data.speed * timeDelta / 1000;
this.el.setAttribute('rotation', rotation);
}
});
Привязка атрибутов к компоненту:
Здесь speed и axis маппятся на свойства
пользовательского компонента spin.
Некоторые компоненты могут включать вложенные объекты или
подкомпоненты. Например, light можно комбинировать
с animation:
Свойство light.intensity маппится на вложенный параметр
компонента light. A-Frame автоматически распознаёт
вложенные ключи через точку (.), что позволяет управлять
сложными структурами компонентов без написания пользовательского
кода.
number, string,
boolean, vec3, color.setAttribute вместо прямой модификации DOM.Система A-Frame поддерживает несколько типов:
position, scale).#RRGGBB или
rgb().document.querySelector).Правильное указание типа данных в схеме компонента гарантирует, что значения будут корректно интерпретироваться движком и визуализироваться без ошибок.
Одна сущность может иметь несколько компонентов, и каждый компонент независимо управляет своей областью:
Каждый компонент получает свой набор атрибутов, что позволяет комбинировать геометрию, материал, анимацию и пользовательские эффекты на одном объекте без конфликтов.