В библиотеке A-Frame камера является сущностью
(<a-entity>), к которой добавлен компонент
camera. По умолчанию при создании сцены автоматически
добавляется одна активная камера. Однако архитектура движка позволяет
размещать в сцене несколько камер одновременно и динамически
переключаться между ними с помощью параметра active.
Компонент camera определяет, какая именно камера
используется системой рендеринга в текущий момент. Управление
осуществляется через булевый параметр:
<a-entity camera="active: true"></a-entity>
Если в сцене присутствует несколько камер, активной может быть только одна.
active:
принцип работыПараметр active принимает логическое значение:
true — камера используется для рендеринга;false — камера существует в сцене, но не участвует в
выводе изображения.При установке active: true для одной камеры, остальные
автоматически становятся неактивными. Это реализовано внутри системы
камеры движка и предотвращает конфликт нескольких источников
рендеринга.
Пример сцены с двумя камерами:
<a-scene>
<a-entity id="cameraOne"
camera="active: true"
position="0 1.6 0">
</a-entity>
<a-entity id="cameraTwo"
camera="active: false"
position="5 3 5">
</a-entity>
</a-scene>
В данном примере рендеринг осуществляется с позиции
cameraOne.
В интерактивных сценах часто используется:
Переключение позволяет менять точку зрения без перезагрузки сцены.
Для анимаций и кат-сцен создаются несколько камер с разными позициями и углами обзора. Переключение между ними позволяет создавать монтаж внутри WebVR/WebXR-сцены.
В проектах с поддержкой виртуальной реальности можно иметь:
look-controls,
wasd-controls);Переключение камер выполняется через изменение атрибута
camera. В A-Frame изменение компонента возможно во время
выполнения.
Пример:
const cam1 = document.querySelector('#cameraOne');
const cam2 = document.querySelector('#cameraTwo');
function switchCamera() {
cam1.setAttribute('camera', 'active', false);
cam2.setAttribute('camera', 'active', true);
}
В результате после вызова функции рендеринг начнётся со второй камеры.
При активации новой камеры движок выполняет:
THREE.Camera внутри
сцены.Под капотом используется интеграция с Three.js, поскольку A-Frame
построен поверх него. Это означает, что активная камера в A-Frame
соответствует активному объекту THREE.Camera в сцене
Three.js.
Компоненты управления (look-controls,
wasd-controls) работают только с активной камерой. Если
камера становится неактивной:
Пример:
<a-entity id="playerCamera"
camera="active: true"
look-controls
wasd-controls>
</a-entity>
Если такая камера будет деактивирована, управление пользователя станет неактуальным, даже если компоненты остаются подключёнными.
Камеры могут быть вложены в другие сущности:
<a-entity id="rig" position="0 0 0">
<a-entity id="vrCamera"
camera="active: true"
position="0 1.6 0">
</a-entity>
</a-entity>
Такой подход используется в VR-проектах для разделения:
Параметр active при этом применяется только к сущности с
компонентом camera.
Если в сцене явно не указана ни одна камера, A-Frame создаёт её автоматически. Она имеет:
cameralook-controlswasd-controlsПри добавлении собственной камеры рекомендуется отключать автоматическую:
<a-scene>
<a-entity camera="active: true"></a-entity>
</a-scene>
Если в сцене появятся две камеры с active: true,
активной станет последняя инициализированная.
Параметр active может изменяться в результате
событий:
<a-entity id="camA"
camera="active: true"
position="0 2 5">
</a-entity>
<a-entity id="camB"
camera="active: false"
position="10 5 10">
</a-entity>
<a-box position="0 1 -3"
color="red"
oncl ick="switchCamera()">
</a-box>
Переключение можно связывать с:
Получение ссылки на активную камеру возможно через объект сцены:
const sceneEl = document.querySelector('a-scene');
const activeCamera = sceneEl.camera;
sceneEl.camera возвращает текущий экземпляр
THREE.Camera, используемый системой рендеринга.
Наличие нескольких камер не создаёт значительной нагрузки, если активна только одна. Однако важно учитывать:
Рекомендуется:
Через прямой доступ к объекту Three.js можно управлять параметрами перспективы:
const cam = document.querySelector('#cameraOne');
const threeCam = cam.getObject3D('camera');
threeCam.fov = 90;
threeCam.updateProjectionMatrix();
Это позволяет изменять угол обзора при переключении между камерами, создавая эффект масштабирования или драматического ракурса.
В сложных проектах переключение реализуется через собственный компонент:
AFRAME.registerComponent('camera-switcher', {
init: function () {
this.cameras = document.querySelectorAll('[camera]');
this.current = 0;
},
switch: function () {
this.cameras[this.current]
.setAttribute('camera', 'active', false);
this.current = (this.current + 1) % this.cameras.length;
this.cameras[this.current]
.setAttribute('camera', 'active', true);
}
});
Такой подход:
Параметр active является центральным механизмом выбора
точки зрения в сцене. Правильное управление несколькими камерами
открывает возможности для создания игровых режимов, кинематографических
эффектов, инструментов отладки и сложных интерактивных сценариев в среде
A-Frame.