Babylon.js предоставляет мощный инструментарий для работы с виртуальной и дополненной реальностью через API WebXR. Ключевыми компонентами для взаимодействия пользователя с XR-сценой являются WebXRInputSource и WebXRAbstractMotionController, обеспечивающие доступ к контроллерам и их функционалу.
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);
});
Особенности использования:
gamepad можно отслеживать нажатия кнопок и изменения
положения стиков.xrController.grip или кастомных
3D-моделей.profiles, можно автоматически подгружать модели для Oculus,
Vive, Index и других.WebXRAbstractMotionController обеспечивает более детализированное управление устройствами ввода, особенно когда требуется доступ к отдельным кнопкам, триггерам и сенсорным зонам контроллера.
Основные возможности:
pressed, touched и value.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:
const xrHelper = await scene.createDefaultXRExperienceAsync({
floorMeshes: [groundMesh]
});
onControllerAddedObservable — событие добавления нового
контроллера.onControllerRemovedObservable — событие удаления
контроллера.onMotionControllerInitObservable — срабатывает при
инициализации абстрактного контроллера.xrController.grip.setParent(scene);
xrController.grip.position = new BABYLON.Vector3(0, 1.5, 0);
motionController у WebXRInputSource.profiles для подгрузки подходящих моделей
контроллеров.onButtonStateChangedObservable с физикой сцены для
реалистичных взаимодействий.Babylon.js с использованием WebXRInputSource и WebXRAbstractMotionController обеспечивает полное управление XR-контроллерами, позволяя создавать реалистичные и интерактивные VR/AR-приложения с поддержкой множества устройств и профилей ввода.