Компонент camera в библиотеке A-Frame определяет точку
наблюдения в трёхмерной сцене. Он задаёт положение и ориентацию
виртуального наблюдателя, формирует матрицу проекции и управляет
отображением объектов на экране или в VR-гарнитуре. Без камеры сцена не
может быть визуализирована.
В основе работы camera лежит механизм проекций из
Three.js, на котором построен A-Frame. Компонент инкапсулирует создание
и настройку THREE.Camera, предоставляя декларативный
HTML-интерфейс.
Минимальный пример камеры:
<a-entity camera></a-entity>
Чаще всего камера размещается внутри сцены:
<a-scene>
<a-entity camera position="0 1.6 0"></a-entity>
</a-scene>
Камера является обычной сущностью (entity), поэтому
поддерживает:
positionrotationscaleПример:
<a-entity position="0 1.6 0">
<a-entity camera></a-entity>
</a-entity>
Такой подход используется для разделения логики движения и логики проекции.
Компонент camera принимает несколько важных свойств.
activecamera="active: true"
Определяет, используется ли камера как основная. В сцене может существовать несколько камер, но активной одновременно будет только одна.
nearБлижняя плоскость отсечения.
camera="near: 0.1"
Объекты ближе указанного значения не отображаются.
farДальняя плоскость отсечения.
camera="far: 1000"
Объекты дальше указанного значения не отображаются.
fovУгол обзора (в градусах).
camera="fov: 80"
Меньшее значение создаёт эффект «зумирования», большее — расширяет поле зрения.
zoomКоэффициент масштабирования.
camera="zoom: 2"
Используется в перспективной камере для дополнительного приближения.
По умолчанию используется перспективная камера
(PerspectiveCamera из Three.js). Она имитирует реальное
человеческое зрение: удалённые объекты выглядят меньше.
Для создания ортографической камеры:
<a-entity camera="projection: orthographic"></a-entity>
Дополнительные параметры:
camera="projection: orthographic; left: -1; right: 1; top: 1; bottom: -1"
В WebVR/WebXR-сценариях камера автоматически синхронизируется с положением гарнитуры. A-Frame использует WebXR API через браузер.
При активации VR:
Пример стандартной конфигурации:
<a-entity id="rig" position="0 0 0">
<a-entity camera look-controls wasd-controls></a-entity>
</a-entity>
Здесь:
look-controls отвечает за управление обзоромwasd-controls — за перемещениеlook-controlsПозволяет вращать камеру мышью или гироскопом устройства.
<a-entity camera look-controls></a-entity>
В VR-режиме компонент автоматически отключает мышиное управление.
wasd-controlsОбеспечивает передвижение по сцене с клавиатуры.
<a-entity camera wasd-controls></a-entity>
Основные клавиши:
Скорость регулируется параметром acceleration.
Практически всегда камера помещается в родительский контейнер — так называемый rig:
<a-entity id="rig" position="0 1.6 0">
<a-entity camera look-controls></a-entity>
</a-entity>
Преимущества:
Телепортация реализуется изменением позиции rig, а не
самой камеры.
Возможна конфигурация с несколькими камерами:
<a-entity id="cam1" camera="active: true"></a-entity>
<a-entity id="cam2" camera="active: false"></a-entity>
Переключение активной камеры через Jav * aScript:
document.querySelector('#cam1').setAttribute('camera', 'active', false);
document.querySelector('#cam2').setAttribute('camera', 'active', true);
Это используется для:
Каждая камера создаёт внутренний объект Three.js. Доступ к нему возможен через:
const el = document.querySelector('[camera]');
const threeCamera = el.getObject3D('camera');
Через threeCamera можно:
Пример изменения угла обзора:
threeCamera.fov = 100;
threeCamera.updateProjectionMatrix();
Для создания интерфейса (HUD) объекты размещаются как дочерние элементы камеры:
<a-entity camera>
<a-entity geometry="primitive: plane; width: 0.5; height: 0.2"
position="0 -0.5 -1"
material="color: black">
</a-entity>
</a-entity>
Такой объект:
Камера участвует в общем жизненном цикле сущностей A-Frame:
initupdateremovetickПример кастомного поведения:
AFRAME.registerComponent('camera-logger', {
tick: function () {
const pos = this.el.object3D.position;
console.log(pos);
}
});
Применение:
<a-entity camera camera-logger></a-entity>
Компонент cursor часто используется совместно с
камерой:
<a-entity camera>
<a-cursor></a-cursor>
</a-entity>
В таком случае луч исходит из центра экрана. Это стандартный способ реализации gaze-based взаимодействия в VR.
Ключевые аспекты:
far уменьшает
нагрузкуnear может вызывать
артефакты глубиныfov влияет на восприятие скорости
движенияДля мобильных VR-устройств рекомендуется:
Полный пример сцены с камерой:
<!DOCTYPE html>
<html>
<head>
<script src="https://aframe.io/releases/1.5.0/aframe.min.js"></script>
</head>
<body>
<a-scene>
<a-entity id="rig" position="0 1.6 0">
<a-entity camera look-controls wasd-controls></a-entity>
</a-entity>
<a-box position="0 1 -3" color="#4CC3D9"></a-box>
</a-scene>
</body>
</html>
<a-entity id="player" position="0 0 0">
<a-entity camera position="0 2 5" look-controls></a-entity>
</a-entity>
<a-entity camera position="10 10 10" rotation="-30 45 0"></a-entity>
<a-entity camera animation="property: position; to: 0 5 0; dur: 5000"></a-entity>
При каждом кадре:
object3DВ VR-режиме матрицы приходят из WebXR и заменяют ручные значения вращения.
Компонент camera является центральным элементом любой
сцены в A-Frame. Он объединяет управление положением наблюдателя,
параметры проекции, VR-трекинг и взаимодействие с другими компонентами,
формируя базовый механизм визуализации трёхмерного пространства в
веб-среде.