WebXR Input API предназначен для обработки пользовательского ввода в виртуальной и дополненной реальности. В A-Frame интеграция с WebXR позволяет отслеживать действия контроллеров, движения головы и другие интерактивные события, создавая полноценный опыт погружения.
A-Frame использует сущность <a-entity> для
представления контроллеров и источников ввода. Ключевыми атрибутами
являются hand-controls, laser-controls и
tracked-controls. Эти компоненты обеспечивают
автоматическое распознавание устройства и подключение к API WebXR.
1. tracked-controls Компонент
tracked-controls предоставляет низкоуровневый доступ к
информации о контроллерах, получаемой от WebXR. Он отслеживает позиции,
ориентацию и события кнопок конкретного устройства. Основные
параметры:
controller: строка, идентифицирующая устройство
(например, oculus-touch, vive).hand: левый или правый контроллер.Пример:
<a-entity tracked-controls="controller: oculus-touch; hand: left"></a-entity>
2. hand-controls hand-controls упрощает
работу с жестами и кнопками, автоматически сопоставляя действия с
моделью устройства. Он предоставляет визуальные модели рук и
контроллеров, а также события нажатия кнопок.
gripdown, gripup,
triggerdown, triggerup.hand: левый или правый.Пример:
<a-entity hand-controls="hand: right"></a-entity>
3. laser-controls laser-controls
добавляет визуальный лазерный указатель для взаимодействия с объектами.
Позволяет реализовать выбор объектов дистанционно, обеспечивая точное
попадание курсора.
click, mouseenter,
mouseleave для взаимодействия с объектами сцены.Пример:
<a-entity laser-controls="hand: left"></a-entity>
A-Frame обрабатывает события ввода через стандартные DOM-события, расширенные под VR/AR:
selectstart / selectend /
select — инициируют действия при нажатии кнопок
взаимодействия.squeezestart / squeezeend
— события сжатия или удержания контроллера.axismove — отслеживание перемещений
джойстика или тачпада.Пример прослушивания событий:
const controller = document.querySelector('#rightController');
controller.addEventListener('triggerdown', () => {
console.log('Триггер нажат');
});
controller.addEventListener('axismove', (evt) => {
console.log('Ось джойстика:', evt.detail.axis);
});
WebXR Input API позволяет получать точные координаты и ориентацию контроллеров. В A-Frame это реализуется через компоненты:
object3D.position — трехмерная позиция
контроллера.object3D.rotation — ориентация в сцене.object3D.quaternion — кватернион для плавного вращения
без глюков углов Эйлера.Пример обновления позиции объекта в реальном времени:
AFRAME.registerComponent('follow-controller', {
init: function () {
this.controller = document.querySelector('#leftController');
},
tick: function () {
if (this.controller) {
this.el.object3D.position.copy(this.controller.object3D.position);
this.el.object3D.quaternion.copy(this.controller.object3D.quaternion);
}
}
});
WebXR Input API обеспечивает унифицированный доступ к контроллерам:
Oculus Touch, HTC Vive, Windows Mixed Reality и другим. A-Frame
автоматически определяет тип контроллера через navigator.xr
и применяет подходящие модели. Для кастомных устройств можно
использовать tracked-controls с явным указанием
id устройства.
В A-Frame есть интеграция с WebXR Hand Input API, позволяющая
отслеживать движение пальцев и жесты. Компонент
hand-tracking-controls обеспечивает:
Пример:
<a-entity hand-tracking-controls="hand: left"></a-entity>
Пример обработки жеста «сжатый кулак»:
handEl.addEventListener('pinchstarted', () => {
console.log('Жест: сжатый кулак');
});
A-Frame позволяет одновременно использовать несколько контроллеров, жесты рук и движения головы. Для этого создаются отдельные сущности для каждого источника ввода, а события можно объединять через компонентную логику:
AFRAME.registerComponent('multi-input', {
init: function () {
this.left = document.querySelector('#leftController');
this.right = document.querySelector('#rightController');
this.head = document.querySelector('#camera');
},
tick: function () {
// Обработка действий всех источников
}
});
Для работы с объектами можно использовать сочетание
raycaster и событий контроллера. Laser или руки направляют
луч на объект, и события mouseenter,
mouseleave, click позволяют реализовать
сложное взаимодействие:
<a-entity laser-controls="hand: right" raycaster="objects: .interactive"></a-entity>
<a-box class="interactive" position="0 1 -3" color="blue"></a-box>
Сценарии включают выбор объектов, перемещение, манипуляции с UI-панелями и управление сценой VR/AR.
raycaster и компоненты A-Frame.Эти инструменты позволяют строить сложные VR/AR-сценарии с высоким уровнем интерактивности и погружения.