wasd-controls — встроенный компонент системы управления
камерой и объектами сцены, обеспечивающий перемещение с клавиатуры по
схеме WASD. Компонент реализует базовую навигацию от первого лица и
используется по умолчанию в стандартной камере a-camera.
Основан на механизме изменения позиции сущности (entity) в
трёхмерном пространстве с учётом направления взгляда.
Компонент отвечает за:
keydown,
keyup)delta timelook-controls и
cameraПеремещение осуществляется в локальной системе координат объекта. Это означает, что направление движения вперёд определяется текущим поворотом камеры.
Типовой сценарий использования — управление камерой пользователя в WebXR- или desktop-сцене.
По умолчанию wasd-controls автоматически добавляется к
a-camera, если явно не отключён:
<a-camera></a-camera>
Эквивалентная явная запись:
<a-camera wasd-controls></a-camera>
Отключение:
<a-camera wasd-controls="enabled: false"></a-camera>
Добавление к произвольной сущности:
<a-entity wasd-controls position="0 1.6 0"></a-entity>
Компонент:
Отслеживает нажатия клавиш:
W — движение вперёдS — назадA — влевоD — вправоСоздаёт вектор направления движения.
Нормализует его.
Умножает на скорость (acceleration).
Умножает на delta time для независимости от
FPS.
Применяет к позиции объекта.
Обновление происходит в методе tick(), который
вызывается каждый кадр.
wasd-controls поддерживает набор параметров
конфигурации.
accelerationСкорость движения в единицах сцены в секунду.
<a-camera wasd-controls="acceleration: 50"></a-camera>
Чем больше значение — тем быстрее перемещение.
adEnabledВключает или отключает боковое движение (A/D).
wasd-controls="adEnabled: false"
wsEnabledУправление движением вперёд/назад (W/S).
wasd-controls="wsEnabled: false"
flyРазрешает движение по вертикальной оси.
По умолчанию перемещение ограничено плоскостью XZ. При включении
fly становится доступно движение по Y.
wasd-controls="fly: true"
constrainToNavMesh
(при использовании nav-mesh)Позволяет ограничить перемещение навигационной сеткой. Используется в сценах с системой навигации.
enabledПолностью включает или отключает компонент.
wasd-controls="enabled: false"
look-controlsНаиболее часто wasd-controls используется совместно с
look-controls:
<a-camera look-controls wasd-controls></a-camera>
look-controls отвечает за поворот камеры мышью или
гироскопом.wasd-controls отвечает за перемещение.Вектор движения вперёд вычисляется с учётом текущего поворота камеры, поэтому направление всегда соответствует взгляду пользователя.
Стандартная реализация не учитывает гравитацию и коллизии.
Перемещение по Y возможно только при fly: true.
Для симуляции ходьбы по земле применяются:
aframe-physics-system)Пример ограничения высоты через компонент:
AFRAME.registerComponent('lock-height', {
tick: function () {
this.el.object3D.position.y = 1.6;
}
});
Скорость можно динамически изменять:
const camera = document.querySelector('a-camera');
camera.setAttribute('wasd-controls', 'acceleration', 100);
Это позволяет реализовать:
Стандартная реализация использует фиксированные клавиши. Для глубокой кастомизации требуется:
Пример расширения:
AFRAME.registerComponent('custom-wasd', {
init: function () {
this.keys = {};
window.addEventListener('keydown', e => {
this.keys[e.code] = true;
});
window.addEventListener('keyup', e => {
this.keys[e.code] = false;
});
},
tick: function (time, delta) {
const velocity = delta / 1000 * 5;
if (this.keys['KeyW']) {
this.el.object3D.position.z -= velocity;
}
}
});
wasd-controls использует delta,
передаваемый в tick(time, delta). Это обеспечивает:
Формула перемещения:
смещение = скорость × (delta / 1000)
В режиме VR:
<a-camera wasd-controls="enabled: true"></a-camera>
Однако в VR это применяется преимущественно для отладки.
Компонент не реализует:
Для добавления коллизий используются:
Пример простой проверки границ:
AFRAME.registerComponent('bounds', {
tick: function () {
const pos = this.el.object3D.position;
pos.x = Math.max(-10, Math.min(10, pos.x));
pos.z = Math.max(-10, Math.min(10, pos.z));
}
});
При большом количестве логики в tick рекомендуется:
THREE.Vector3Внутри компонента:
object3D.getWorldDirectionСистема основана на объектной модели three.js, через
object3D каждой сущности.
Стандартное поведение:
Это предотвращает «залипание» движения.
Компонент работает:
Поддерживается всеми современными браузерами с WebGL.
wasd-controls остаётся базовым инструментом навигации в
сценах A-Frame. Его простота делает его удобным для быстрого
прототипирования, а расширяемость позволяет адаптировать под игровые и
симуляционные задачи любой сложности.