Babylon.js предоставляет встроенную поддержку WebXR
API, позволяя создавать VR и AR приложения прямо в браузере.
Основная точка входа для работы с WebXR — это создание
XR-сессии через объект сцены. Для этого используется
класс WebXRDefaultExperience, который инкапсулирует все
необходимые элементы: камеру, контроллеры и базовую систему ввода.
const xr = await scene.createDefaultXRExperienceAsync({
floorMeshes: [ground]
});
Параметр floorMeshes определяет объекты, которые будут
использоваться для определения пола в AR/VR, что позволяет правильно
позиционировать пользователя и объекты сцены.
Babylon.js поддерживает несколько режимов работы WebXR:
Выбор режима определяется при создании XR-проекта и автоматически проверяется на поддерживаемость браузером и устройством.
const xrSession = await navigator.xr.requestSession("immersive-vr");
Babylon.js упрощает этот процесс через обертку
WebXRDefaultExperience, автоматически управляя проверкой
совместимости и инициализацией сессии.
При активации XR-сессии создается XR-кamera, которая
наследует от стандартной Babylon.js камеры. Для VR обычно используется
WebXRCamera, а для AR —
WebXRNearInteractionSystem, обеспечивающий корректное
взаимодействие с объектами сцены.
Основные возможности камеры:
Для работы с контроллерами используются события:
xr.input.onControllerAddedObservable.add((controller) => {
controller.onMotionControllerInitObservable.add((motionController) => {
console.log("Контроллер инициализирован", motionController);
});
});
Каждый контроллер предоставляет доступ к кнопкам, триггерам и джойстику, а Babylon.js автоматически синхронизирует их с виртуальной сценой.
Для AR-сцен критически важно определение плоскостей и поверхностей. Babylon.js использует возможности hit-test WebXR:
xr.baseExperience.featuresManager.enableFeature(
WebXRFeatureName.HIT_TEST,
"latest"
);
После активации можно помещать объекты на реальное пространство, используя координаты, полученные через hit-test. Пример размещения объекта на поверхности:
scene.onBeforeRenderObservable.add(() => {
if (xr.baseExperience.sessionManager.hitTestResults.length) {
const hit = xr.baseExperience.sessionManager.hitTestResults[0];
myMesh.position.copyFrom(hit.position);
}
});
Также можно включить визуальные индикаторы, показывающие место предполагаемой установки объекта, улучшая UX в AR-приложениях.
Babylon.js позволяет интегрировать WebXR с физическими движками (Cannon.js, Oimo.js, Ammo.js). Это обеспечивает реалистичное поведение объектов при взаимодействии с контроллерами:
const sphere = MeshBuilder.CreateSphere("sphere", {diameter: 0.2}, scene);
sphere.physicsImpostor = new PhysicsImpostor(
sphere, PhysicsImpostor.SphereImpostor, {mass: 1, restitution: 0.9}, scene
);
Контроллеры могут захватывать объекты и перемещать их с использованием pointer drag behavior или напрямую через события MotionController:
controller.onTriggerStateChangedObservable.add((state) => {
if (state.pressed) {
grabMesh(myMesh, controller);
}
});
Такой подход позволяет создавать полноценные интерактивные VR/AR сцены с реалистичной физикой и взаимодействием.
WebXR-сцены требуют оптимизации для высокой частоты кадров (обычно 72–120 FPS):
scene.getEngine().hardwareScalingLevel.Babylon.js автоматически управляет ресурсами при переключении между XR-сессиями, но ручная оптимизация повышает стабильность на мобильных устройствах и автономных VR-шлемах.
WebXR поддерживает пространственный звук через Babylon.js
AudioDopplerEffect и Sound объекты. Аудио
может привязываться к объектам или камере:
const sound = new Sound("effect", "audio/explosion.mp3", scene, null, {
spatialSound: true,
maxDistance: 10,
rolloffFactor: 2
});
sound.attachToMesh(myMesh);
Пространственный звук повышает погружение, особенно в VR-сценах, где важно ощущение направления и расстояния до источника.
Babylon.js позволяет создавать XR-совместимые интерфейсы с помощью GUI 3D:
const advancedTexture = AdvancedDynamicTexture.CreateFullscreenUI("UI");
const button = Button.CreateSimpleButton("btn", "Нажми меня");
button.width = "150px";
button.height = "50px";
advancedTexture.addControl(button);
GUI-элементы могут размещаться в трехмерном пространстве и
взаимодействовать с контроллерами через коллайдеры и события
onPointerClickObservable.
Babylon.js поддерживает расширенные возможности WebXR через features manager:
WebXRBackgroundRemover — удаление фона в AR.WebXRHandTracking — отслеживание движения рук без
контроллеров.WebXRLightEstimation — оценка освещения реальной сцены
для корректного освещения виртуальных объектов.WebXRAnchorSystem — закрепление объектов на
фиксированных позициях в пространстве.Каждая функция активируется через менеджер фич:
xr.baseExperience.featuresManager.enableFeature(
WebXRFeatureName.HAND_TRACKING,
"latest",
{jointMeshes: true}
);
Это позволяет создавать AR/VR-приложения, максимально интегрированные с реальной средой и обеспечивающие высокую интерактивность.
Babylon.js обеспечивает совместимость с большинством WebXR-устройств:
Oculus, Vive, HoloLens, мобильные AR на iOS и Android. Использование
WebXRDefaultExperience упрощает кросс-платформенную
поддержку, автоматически подбирая доступные функции и оптимизируя
рендеринг для конкретного устройства.
WebXR в Babylon.js — это мощный инструмент для разработки VR и AR приложений, который сочетает в себе простоту интеграции, гибкость управления сценой и широкие возможности по взаимодействию с пользователем.