Телепортация: WebXRMotionControllerTeleportation

Телепортация в Babylon.js реализуется с помощью системы WebXR, которая обеспечивает взаимодействие с устройствами виртуальной и дополненной реальности. Компонент WebXRMotionControllerTeleportation предоставляет готовый инструмент для перемещения пользователя по сцене без традиционного движения через контроллеры или клавиатуру. Такой подход уменьшает риск укачивания и позволяет создавать естественные сценарии перемещения.

Инициализация WebXR и сцены

Создание сцены начинается с базового объекта 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]);
  • addFloorMesh(mesh) — добавляет поверхность, по которой разрешена телепортация.
  • attachController(controller) — привязывает конкретный контроллер к системе телепортации.

Настройка визуализации точки телепортации

Для улучшения восприятия пространства телепортация поддерживает визуальные индикаторы:

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);
});
  • onBeforeTeleportObservable — вызывается до перемещения, например для проверки коллизий или сохранения состояния.
  • onAfterTeleportObservable — вызывается после завершения телепортации, полезно для проигрывания эффектов или обновления UI.

Настройка ограничений и дистанции

Телепортация может быть ограничена по максимальной и минимальной дистанции, а также по углу наклона пола:

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.