Контроллеры: WebXRInputSource и WebXRAbstractMotionController

Babylon.js предоставляет мощный инструментарий для работы с виртуальной и дополненной реальностью через API WebXR. Ключевыми компонентами для взаимодействия пользователя с XR-сценой являются WebXRInputSource и WebXRAbstractMotionController, обеспечивающие доступ к контроллерам и их функционалу.


WebXRInputSource

WebXRInputSource представляет физический источник ввода в XR-сессии: это может быть контроллер, руки пользователя или даже глазной трекер. Основные свойства объекта включают:

  • handedness — определяет принадлежность контроллера: 'left', 'right' или 'none'. Используется для правильного позиционирования моделей контроллеров и взаимодействия с объектами сцены.
  • targetRayMode — тип луча, исходящего от контроллера, может быть 'tracked-pointer' или 'gaze'.
  • gamepad — объект Gamepad API, предоставляющий доступ к кнопкам и стикам контроллера.
  • profiles — массив поддерживаемых профилей контроллера, используемый для загрузки соответствующих 3D-моделей.

Пример инициализации XR-контроллера:

const xr = await scene.createDefaultXRExperienceAsync({});
xr.input.onControllerAddedObservable.add((xrController) => {
    console.log("Контроллер добавлен:", xrController.inputSource.handedness);
});

Особенности использования:

  1. Обработка событий кнопок: через объект gamepad можно отслеживать нажатия кнопок и изменения положения стиков.
  2. Привязка к объектам сцены: контроллеры можно визуализировать с помощью xrController.grip или кастомных 3D-моделей.
  3. Поддержка разных устройств: благодаря свойству profiles, можно автоматически подгружать модели для Oculus, Vive, Index и других.

WebXRAbstractMotionController

WebXRAbstractMotionController обеспечивает более детализированное управление устройствами ввода, особенно когда требуется доступ к отдельным кнопкам, триггерам и сенсорным зонам контроллера.

Основные возможности:

  • Кнопки и сенсорные зоны: контроллер разбит на элементы, каждый из которых представлен объектом с состояниями pressed, touched и value.
  • Маппинг профилей: библиотека Babylon.js поддерживает множество стандартных профилей, включая oculus-touch, vive, windows-mixed-reality. Контроллер автоматически сопоставляет кнопки и стики с визуальными элементами сцены.
  • Обновление состояний: метод updateFromGamepad() синхронизирует состояние модели контроллера с текущими данными Gamepad API.

Пример использования абстрактного контроллера:

xr.input.onControllerAddedObservable.add((xrController) => {
    if (xrController.motionController) {
        const trigger = xrController.motionController.getComponent("xr-standard-trigger");
        trigger.onButtonStateChangedObservable.add((component) => {
            console.log("Состояние триггера:", component.value);
        });
    }
});

Преимущества WebXRAbstractMotionController:

  • Унификация работы с разными устройствами.
  • Возможность визуализировать каждую кнопку и триггер в 3D-пространстве.
  • Расширенные возможности для создания интерактивных приложений: управление объектами сцены через отдельные компоненты контроллера.

Интеграция контроллеров с Babylon.js

  1. Создание сцены и XR-сессии:
const xrHelper = await scene.createDefaultXRExperienceAsync({
    floorMeshes: [groundMesh]
});
  1. Добавление наблюдателей контроллеров:
  • onControllerAddedObservable — событие добавления нового контроллера.
  • onControllerRemovedObservable — событие удаления контроллера.
  • onMotionControllerInitObservable — срабатывает при инициализации абстрактного контроллера.
  1. Привязка моделей к контроллерам:
xrController.grip.setParent(scene);
xrController.grip.position = new BABYLON.Vector3(0, 1.5, 0);
  1. Слежение за действиями пользователя:
  • Отслеживание нажатий кнопок.
  • Обработка перемещения стиков и трекпадов.
  • Реализация геймификационных механик, таких как захват и бросок объектов.

Практические советы

  • Для корректной работы на разных устройствах всегда проверять наличие motionController у WebXRInputSource.
  • Использовать profiles для подгрузки подходящих моделей контроллеров.
  • При разработке интерактивных сцен стоит комбинировать события onButtonStateChangedObservable с физикой сцены для реалистичных взаимодействий.
  • Для оптимизации рендеринга контроллеры можно визуализировать упрощенными моделями, оставляя детализированные модели только для основных объектов сцены.

Babylon.js с использованием WebXRInputSource и WebXRAbstractMotionController обеспечивает полное управление XR-контроллерами, позволяя создавать реалистичные и интерактивные VR/AR-приложения с поддержкой множества устройств и профилей ввода.