Телепортация в Babylon.js реализуется с помощью системы WebXR, которая обеспечивает взаимодействие с устройствами виртуальной и дополненной реальности. Компонент WebXRMotionControllerTeleportation предоставляет готовый инструмент для перемещения пользователя по сцене без традиционного движения через контроллеры или клавиатуру. Такой подход уменьшает риск укачивания и позволяет создавать естественные сценарии перемещения.
Создание сцены начинается с базового объекта
BABYLON.Scene и движка BABYLON.Engine. Для
работы с WebXR необходимо получить XR-сессию через
менеджер WebXRExperienceHelper.
const canvas = document.getElementById("renderCanvas");
const engine = new BABYLON.Engine(canvas, true);
const scene = new BABYLON.Scene(engine);
const xrHelper = await scene.createDefaultXRExperienceAsync({
floorMeshes: [groundMesh]
});
Здесь floorMeshes — массив мешей, на которых разрешено
перемещение. Это важно для корректной работы телепортации.
Компонент телепортации подключается через motion controller, который представляет собой устройство ввода пользователя. Babylon.js автоматически связывает контроллеры с сессией XR:
const teleportation = xrHelper.teleportation;
teleportation.addFloorMesh(groundMesh);
teleportation.attachController(xrHelper.input.controllers[0]);
Для улучшения восприятия пространства телепортация поддерживает визуальные индикаторы:
teleportation.teleportationTargetMesh = BABYLON.MeshBuilder.CreateSphere("target", {diameter: 0.2}, scene);
teleportation.setTargetMeshColor(BABYLON.Color3.Green());
teleportationTargetMesh — объект, отображающий место
назначения.setTargetMeshColor(color) — задает цвет
индикатора.Можно использовать собственные материалы и анимации, чтобы сделать перемещение более заметным и реалистичным.
События позволяют выполнять действия до и после перемещения пользователя:
teleportation.onBeforeTeleportObservable.add((targetPosition) => {
console.log("Перед телепортацией:", targetPosition);
});
teleportation.onAfterTeleportObservable.add((targetPosition) => {
console.log("После телепортации:", targetPosition);
});
Телепортация может быть ограничена по максимальной и минимальной дистанции, а также по углу наклона пола:
teleportation.maxDistance = 10; // максимальная дальность телепортации
teleportation.minDistance = 1; // минимальная дальность
teleportation.floorAngle = Math.PI / 6; // допустимый угол наклона поверхности
Эти параметры обеспечивают безопасное перемещение по сложной сцене и предотвращают телепортацию на недопустимые поверхности.
Babylon.js позволяет подключать несколько контроллеров одновременно. Каждый контроллер можно настроить индивидуально:
xrHelper.input.onControllerAddedObservable.add((controller) => {
if(controller.inputSource.handedness === "right"){
teleportation.attachController(controller);
}
});
Такой подход удобен для многорукого взаимодействия или поддержки различных типов контроллеров.
С помощью Babylon.js можно интегрировать визуальные эффекты при перемещении: частицы, подсветку цели или анимацию движения камеры. Это повышает реализм и помогает пользователю ориентироваться в виртуальной среде. Также поддерживаются события столкновения, позволяющие ограничивать телепортацию внутри определённых зон или объектов.
Система WebXRMotionControllerTeleportation в Babylon.js предоставляет гибкий и настраиваемый инструмент для перемещения в VR-сценах. Она сочетает безопасность, удобство и возможность интеграции с визуальными эффектами, что делает её ключевым элементом интерактивного опыта в WebXR.