В библиотеке A-Frame ключевую роль играет глобальный
объект AFRAME, который выступает как центральная точка
доступа к функциональности фреймворка. Он инкапсулирует систему
компонентов, систем, схем, регистраций и вспомогательных утилит для
работы с виртуальной реальностью в браузере. Понимание структуры
AFRAME и его свойств является фундаментальным для создания
сложных VR-приложений.
AFRAMEAFRAME.componentsСодержит реестр всех зарегистрированных компонентов. Компоненты в
A-Frame — это модули, расширяющие функциональность сущностей
(<a-entity>). Каждый компонент описывается объектом
со следующими ключевыми методами:
init() — инициализация компонента при создании
сущности.update(oldData) — вызов при изменении данных
компонента.remove() — очистка ресурсов при удалении
компонента.tick(time, deltaTime) — вызывается на каждом кадре,
позволяет реализовать анимации и динамическое поведение.Пример регистрации компонента:
AFRAME.registerComponent('spin', {
schema: { speed: { type: 'number', default: 1 } },
tick: function (time, deltaTime) {
this.el.object3D.rotation.y += this.data.speed * deltaTime / 1000;
}
});
Доступ к компоненту можно получить через
AFRAME.components['spin'].
AFRAME.systemsРеестр систем отвечает за управление глобальными аспектами сцены. Системы позволяют объединять функциональность, которая может использоваться несколькими сущностями. Примеры систем:
renderer — управление рендерером Three.js.physics — обработка физических расчетов сцены.input — управление пользовательскими
взаимодействиями.Системы регистрируются аналогично компонентам:
AFRAME.registerSystem('exampleSystem', {
init: function () { console.log('System initialized'); },
tick: function (time, deltaTime) { /* логика обновления */ }
});
Сущности могут обращаться к системам через
this.el.sceneEl.systems.exampleSystem.
AFRAME.shadersХранит все зарегистрированные шейдеры для материалов. Шейдеры
определяют, как поверхность объектов реагирует на освещение и визуальные
эффекты. Стандартные шейдеры включают standard,
flat, lambert и phong.
Пользовательские шейдеры регистрируются с помощью:
AFRAME.registerShader('customShader', {
schema: { color: { type: 'color', default: '#FFF' } },
vertexShader: '...',
fragmentShader: '...'
});
AFRAME.primitivesПримитивы — это заранее настроенные комбинации сущностей и
компонентов, например <a-box>,
<a-sphere>. Они облегчают создание сцены, позволяя
использовать декларативный HTML вместо явной регистрации сущностей и
компонентов через JS.
AFRAME.utilsНабор утилитарных функций, используемых во внутренней логике A-Frame или для ускорения разработки. Основные методы:
AFRAME.utils.entity.setComponentProperty(entity, component, property, value)
— безопасное обновление свойства компонента.AFRAME.utils.styleParser.parse(cssText) — парсинг
CSS-стиля в объект.AFRAME.utils.clone(object) — глубокое клонирование
объектов.Утилиты важны для написания модульного и надежного кода.
AFRAME.registerComponent и
AFRAME.registerSystemМетоды регистрации — фундамент для расширения фреймворка:
AFRAME.registerComponent(name, definition) — добавление
нового компонента в реестр.AFRAME.registerSystem(name, definition) — добавление
глобальной системы.Оба метода возвращают зарегистрированный объект, что позволяет использовать их напрямую.
AFRAME.versionСодержит строку с текущей версией библиотеки. Это полезно для проверки совместимости кода при загрузке внешних компонентов или плагинов.
console.log('A-Frame version:', AFRAME.version);
AFRAME.isSceneФункция для проверки, является ли DOM-элемент сценой A-Frame. Используется при динамическом создании сущностей:
if (AFRAME.isScene(document.querySelector('a-scene'))) {
console.log('Элемент — сцена A-Frame');
}
Глобальный объект AFRAME организован по принципу
реестров и фабрик:
components,
systems, shaders, primitives)
позволяют хранить и искать расширяемые элементы.registerComponent,
registerSystem) обеспечивают единообразное создание новых
модулей.utils) упрощают работу с
объектами и сущностями, снижая риск ошибок при прямом манипулировании
сценой.Это позволяет строить сложные VR-приложения, сохраняя контроль над каждым аспектом сцены и компонентами.
Каждая сущность <a-entity> при добавлении
компонента получает ссылку на глобальный объект через
AFRAME.components. Системы могут обращаться к компонентам
всех сущностей сцены через sceneEl.systems, обеспечивая
гибкую архитектуру связанных модулей. Такой подход
упрощает управление состоянием сцены, синхронизацию данных и внедрение
кастомной логики.
Создание вращающегося куба с кастомным шейдером и системой управления:
AFRAME.registerShader('colorPulse', {
schema: { color: { type: 'color', default: '#FF0000' } },
fragmentShader: 'void main() { gl_FragColor = vec4(1.0,0.0,0.0,1.0); }',
vertexShader: 'void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); }'
});
AFRAME.registerComponent('pulse', {
tick: function (time) {
this.el.object3D.scale.setScalar(Math.sin(time/500)+1.5);
}
});
AFRAME.registerSystem('globalControl', {
init: function () { console.log('Global system ready'); }
});
Использование в HTML:
<a-scene>
<a-box position="0 1 -5" material="shader: colorPulse" pulse></a-box>
</a-scene>
Такое взаимодействие демонстрирует мощь AFRAME как
центрального объекта для управления компонентами, системами, шейдерами и
сценой в целом.