В A-Frame объект el.sceneEl представляет собой ссылку на
корневую сцену, к которой принадлежит любой сущностный элемент
(entity). Этот объект обеспечивает доступ к глобальным
методам и свойствам сцены, позволяя управлять рендерингом, системами,
событиями и жизненным циклом компонентов. Использование
el.sceneEl является ключевым для создания сложных
интерактивных сцен и оптимизации работы с компонентной архитектурой.
Каждая сущность в A-Frame автоматически хранит ссылку на родительскую
сцену через свойство sceneEl. Например:
AFRAME.registerComponent('log-scene', {
init: function () {
console.log(this.el.sceneEl); // вывод объекта сцены
}
});
Здесь this.el — это сущность, а
this.el.sceneEl позволяет получить объект сцены для
последующих действий.
Особенности:
sceneEl будет
null.sceneEl актуален только после момента
attachedCallback или init компонента, когда
элемент уже вставлен в DOM.sceneElСцена в A-Frame содержит системы (systems) — глобальные
менеджеры логики, доступные всем компонентам. Через
el.sceneEl можно получать доступ к любой системе:
const physicsSystem = el.sceneEl.systems['physics'];
physicsSystem.step(); // вызов метода системы
Ключевые возможности:
el.sceneEl позволяет подписываться на события,
происходящие на уровне всей сцены:
el.sceneEl.addEventListener('enter-vr', () => {
console.log('Пользователь вошёл в VR');
});
el.sceneEl.addEventListener('loaded', () => {
console.log('Сцена полностью загружена');
});
События сцены делятся на несколько типов:
loaded,
renderstart, enter-vr,
exit-vr.click,
controllerconnected.Сцена A-Frame является оберткой над THREE.Scene. Через
el.sceneEl доступен object3D, который
позволяет использовать нативные методы Three.js:
const threeScene = el.sceneEl.object3D;
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
threeScene.add(ambientLight);
Преимущества:
sceneElsceneEl часто используется для программного создания
сущностей и добавления их в сцену:
const newEntity = document.createElement('a-box');
newEntity.setAttribute('position', '0 1 -3');
newEntity.setAttribute('color', 'red');
el.sceneEl.appendChild(newEntity);
Преимущества такого подхода:
С помощью sceneEl доступны встроенные методы сцены:
emit(eventName, detail, bubble) — генерация события на
уровне сцены.querySelector(selector) и
querySelectorAll(selector) — поиск сущностей внутри
сцены.removeChild(el) — удаление сущностей из сцены.Пример генерации события:
el.sceneEl.emit('custom-event', { value: 42 });
Это позволяет компонентам и системам подписываться на глобальные события и синхронизировать свои действия.
sceneElДля сложных приложений важно отслеживать момент полной готовности сцены:
el.sceneEl.addEventListener('loaded', () => {
console.log('Все сущности сцены и ресурсы загружены');
});
Особенности:
loaded срабатывает только один раз, после
полной инициализации сцены.el.sceneEl.systems и
object3D могут быть неполными.sceneEl позволяет отложить создание
динамических элементов до готовности сцены.el.sceneEl только после вставки сущности в
DOM.sceneEl, а не к отдельным сущностям.el.sceneEl.object3D, избегая обхода через
el.object3D.parent.appendChild, removeChild и
emit через sceneEl для единообразной
работы.el.sceneEl является центральной точкой взаимодействия с
A-Frame сценой, обеспечивая полный контроль над системами, событиями,
объектами и жизненным циклом сцены, что делает её незаменимым
инструментом при создании интерактивных и масштабируемых VR/AR
приложений.