Компонент oculus-touch-controls предназначен для
интеграции контроллеров виртуальной реальности Oculus Touch в сцены
A-Frame. Он обеспечивает полный доступ к вводу пользователя: кнопки,
триггеры, джойстики и позиционное отслеживание рук. Компонент работает
только в WebXR-среде и требует поддержки VR-устройств, таких как Oculus
Quest 2 или Oculus Rift S.
Компонент добавляется к сущности <a-entity>:
<a-entity oculus-touch-controls="hand: left"></a-entity>
<a-entity oculus-touch-controls="hand: right"></a-entity>
Параметр hand принимает значения:
left — левая рука.right — правая рука.По умолчанию компонент автоматически создаёт модель контроллера,
визуализируя его положение и ориентацию в пространстве. Если необходимо
скрыть модель, используется атрибут model: false:
<a-entity oculus-touch-controls="hand: left; model: false"></a-entity>
hand Определяет, к какой руке
привязан контроллер. Используется для различения левого и правого
контроллеров, что важно при назначении действий на кнопки и
триггеры.
model Отвечает за визуализацию
3D-модели контроллера. Может принимать true или
false.
true — отображает стандартную модель Oculus Touch.false — отключает визуализацию, оставляя только
функциональность ввода.buttonColor Настройка цвета кнопок
в модели. Пример:
<a-entity oculus-touch-controls="hand: right; buttonColor: #ff0000"></a-entity>
emulateTouch Позволяет тестировать
взаимодействие с контроллером без физического устройства. При значении
true движение и нажатия кнопок эмулируются с помощью мыши и
клавиатуры.Компонент генерирует набор событий, которые позволяют отслеживать действия пользователя. События делятся на три группы: кнопки, триггеры и джойстик.
abuttondown / abuttonup — нажатие и
отпускание кнопки A.bbuttondown / bbuttonup — нажатие и
отпускание кнопки B.xbuttondown / xbuttonup — кнопка X.ybuttondown / ybuttonup — кнопка Y.Пример прослушивания события:
document.querySelector('[oculus-touch-controls]').addEventListener('abuttondown', function () {
console.log('Кнопка A нажата');
});
triggerdown / triggerup — основной триггер
пальца.gripdown / gripup — кнопка захвата
(grip).triggerchanged / gripchanged — изменение
силы нажатия (значение от 0 до 1).Пример использования силы нажатия:
el.addEventListener('triggerchanged', (event) => {
console.log('Сила нажатия триггера:', event.detail.value);
});
thumbstickmoved — движение джойстика, возвращает объект
с координатами x и y.thumbstickdown / thumbstickup — нажатие и
отпускание джойстика.el.addEventListener('thumbstickmoved', (event) => {
const { x, y } = event.detail;
console.log(`Джойстик смещён: x=${x}, y=${y}`);
});
Контроллер автоматически привязывается к пространственным координатам
пользователя. Используются стандартные компоненты position
и rotation. Для расширенного контроля можно использовать
систему событий pose:
el.addEventListener('controllerconnected', () => {
console.log('Контроллер подключен');
});
el.addEventListener('controllerdisconnected', () => {
console.log('Контроллер отключён');
});
Манипуляции с объектами в VR:
<a-box id="cube" position="0 1.5 -3" color="#4CC3D9"></a-box>
<a-entity oculus-touch-controls="hand: left"
grab-start="#cube"
grab-end="#cube"></a-entity>
События grab-start и grab-end реализуются
через дополнительные компоненты или систему A-Frame
super-hands, позволяя захватывать объекты и перемещать
их.
Реализация телепортации с помощью джойстика:
el.addEventListener('thumbstickmoved', (event) => {
const { x, y } = event.detail;
if (y > 0.95) {
// логика телепортации вперед
}
});
super-hands, laser-controls, и может
интегрироваться с физическими движками ammo.js или
cannon.js.model: false) для снижения
нагрузки на рендеринг.Компонент oculus-touch-controls является фундаментальным
инструментом для создания интерактивных VR-приложений на базе A-Frame,
предоставляя полный контроль над вводом пользователя и интеграцию с
3D-сценой без необходимости писать низкоуровневый код WebXR.