Библиотека Babylon.js предоставляет удобный интерфейс для работы с виртуальной и дополненной реальностью через объект WebXRDefaultExperience. Этот класс позволяет создать полностью функциональный XR-контекст с минимальной конфигурацией. Основной принцип работы заключается в том, что сцена автоматически получает XR-сессию, камеры и контроллеры.
const canvas = document.getElementById("renderCanvas");
const engine = new BABYLON.Engine(canvas, true);
const scene = new BABYLON.Scene(engine);
BABYLON.WebXRDefaultExperience.CreateAsync(scene).then((xrExperience) => {
// xrExperience содержит камеры, контроллеры и сцепление с XR-сессией
});
Здесь метод CreateAsync возвращает промис с объектом
xrExperience, который объединяет все ключевые компоненты
XR: camera, input,
session и features.
WebXRDefaultExperience состоит из нескольких важных объектов:
Камера, создаваемая WebXRDefaultExperience, является XR-специфичной. Она наследует свойства обычной Babylon.js камеры, но управляется XR-системой.
xrExperience.baseExperience.camera.position = new BABYLON.Vector3(0, 1.6, 0);
xrExperience.baseExperience.camera.attachControl(canvas, true);
Контроллеры XR автоматически создаются при старте сессии. Объект input позволяет получать события нажатий и движения:
xrExperience.input.onControllerAddedObservable.add((controller) => {
controller.onMotionControllerInitObservable.add((motionController) => {
console.log("Контроллер инициализирован:", motionController);
});
controller.onTriggerStateChangedObservable.add((state) => {
console.log("Состояние триггера:", state.value);
});
});
Ключевые моменты:
onControllerAddedObservable срабатывает при подключении
нового контроллера.onMotionControllerInitObservable предоставляет доступ к
физическим кнопкам и сенсорам.onTriggerStateChangedObservable отслеживает изменение
состояния триггера.Сессия XR создается автоматически, но можно управлять её началом и завершением через sessionManager:
// Запуск XR-сессии
xrExperience.baseExperience.enterXRAsync("immersive-vr", "local-floor").then(() => {
console.log("XR-сессия начата");
});
// Завершение сессии
xrExperience.baseExperience.exitXRAsync().then(() => {
console.log("XR-сессия завершена");
});
Метод enterXRAsync принимает тип сессии и
пространство отслеживания ("local-floor",
"bounded-floor", "viewer"). Метод
exitXRAsync корректно завершает сессию и освобождает
ресурсы.
Babylon.js поддерживает подключаемые функции XR через featuresManager:
const handTracking = xrExperience.baseExperience.featuresManager.enableFeature(
BABYLON.WebXRFeatureName.HAND_TRACKING,
"latest",
{ xrInput: xrExperience.input }
);
handTracking.onHandAddedObservable.add((hand) => {
console.log("Рука обнаружена:", hand);
});
Основные возможности featuresManager:
WebXRDefaultExperience предоставляет наблюдаемые события, позволяющие синхронизировать логику приложения с XR:
Пример использования:
xrExperience.baseExperience.sessionManager.onXRSessionInitObservable.add(() => {
console.log("Сессия XR готова к использованию");
});
Тип сессии XR определяется при входе:
Пример создания AR-сессии:
xrExperience.baseExperience.enterXRAsync("immersive-ar", "local-floor");
Babylon.js автоматически адаптирует камеру и координаты объектов под выбранный тип XR.
WebXRDefaultExperience позволяет сосредоточиться на логике приложения, не погружаясь в низкоуровневые детали WebXR. Для динамического управления объектами используется стандартная сцена Babylon.js:
const box = BABYLON.MeshBuilder.CreateBox("box", { size: 0.3 }, scene);
box.position.set(0, 1, -1);
scene.onBeforeRenderObservable.add(() => {
box.rotation.y += 0.01;
});
Объекты автоматически отображаются корректно в VR и AR с настройками XR-камеры. Контроллеры позволяют управлять взаимодействием без дополнительной конфигурации.
WebXRDefaultExperience объединяет все ключевые аспекты XR в Babylon.js: камеры, контроллеры, события, функции и управление сессией. Его использование сокращает количество кода и позволяет быстро перейти к созданию интерактивных VR/AR-сцен, оставляя пространство для расширения через featuresManager и события жизненного цикла.