WebXRSessionManager: управление сессией

WebXRSessionManager является ключевым компонентом для управления сессиями виртуальной и дополненной реальности в Babylon.js. Он предоставляет интерфейс для создания, запуска и завершения XR-сессий, а также для взаимодействия с устройствами и сценой.

В Babylon.js XR-сессия всегда привязана к WebXRExperienceHelper или к WebXRDefaultExperience, которые используют WebXRSessionManager для контроля жизненного цикла сессии. Этот менеджер отвечает за настройку рендеринга, обработку ввода и событий XR.


Создание и инициализация сессии

Сессия XR создается через метод:

const xrSessionManager = scene.createDefaultXRExperienceAsync({
    uiOptions: { sessionMode: "immersive-vr" }
}).then((xrExperience) => {
    const sessionManager = xrExperience.baseExperience.sessionManager;
});

Ключевые моменты:

  • sessionMode определяет тип сессии: "immersive-vr" для полного погружения, "immersive-ar" для дополненной реальности, "inline" для встроенной XR.
  • Метод createDefaultXRExperienceAsync возвращает объект с baseExperience, через который осуществляется доступ к WebXRSessionManager.
  • XR-сессия создается асинхронно, что позволяет проверять поддержку устройства перед инициализацией.

Управление жизненным циклом сессии

WebXRSessionManager предоставляет методы для запуска и завершения сессии:

sessionManager.initializeAsync().then(() => {
    console.log("Сессия инициализирована");
});

sessionManager.exitXRAsync().then(() => {
    console.log("Сессия завершена");
});

Особенности:

  • initializeAsync() запускает XR-сессию с текущими настройками сцены и камер.
  • exitXRAsync() корректно завершает сессию, освобождая ресурсы и отключая рендеринг XR.
  • Состояние сессии можно проверять через sessionManager.sessionRunning, которое возвращает true при активной XR-сессии.

События WebXRSessionManager

Менеджер поддерживает подписку на ключевые события:

sessionManager.onXRFrameObservable.add((frame) => {
    // Обновление объектов на каждый кадр XR
});

sessionManager.onXRSessionInit.add(() => {
    console.log("Сессия запущена");
});

sessionManager.onXRSessionEnded.add(() => {
    console.log("Сессия завершена");
});

Описание событий:

  • onXRFrameObservable вызывается каждый кадр XR, позволяя синхронизировать анимацию и физику.
  • onXRSessionInit срабатывает при успешной инициализации сессии.
  • onXRSessionEnded срабатывает при завершении сессии через exitXRAsync() или по инициативе пользователя.

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

WebXRSessionManager управляет камерами XR и параметрами рендеринга:

const xrCamera = sessionManager.getCamera();
xrCamera.position = new BABYLON.Vector3(0, 1.6, 0);

Основные моменты:

  • getCamera() возвращает активную XR-камеру, которая синхронизирована с положением головы пользователя.
  • Камера автоматически привязана к контроллерам движения и позициям глаз, обеспечивая корректное отображение стерео.
  • Менеджер позволяет включать или отключать рендеринг через sessionManager.scene.autoClear = false, что полезно для смешанной реальности.

Управление контроллерами и вводом

Контроллеры XR и взаимодействие с объектами сцены управляются через WebXRInput. WebXRSessionManager связывает их с сессией:

sessionManager.input.onControllerAddedObservable.add((controller) => {
    console.log("Контроллер добавлен", controller.uniqueId);
});

Особенности ввода:

  • Каждый контроллер XR регистрируется при подключении и отслеживается через onControllerAddedObservable.
  • Обновления кнопок, триггеров и сенсорных панелей доступны через свойства motionController каждого контроллера.
  • sessionManager.input.onControllerRemovedObservable позволяет корректно обрабатывать отключение устройств.

Поддержка AR и VR

WebXRSessionManager универсален для VR и AR:

  • Для VR активируется "immersive-vr" с полным контролем сцены.
  • Для AR используется "immersive-ar" с возможностью смешивать 3D-объекты с реальным миром, получаемым через камеру устройства.
  • Поддержка AR включает настройку referenceSpaceType ("local" или "local-floor") для корректного позиционирования объектов.

Оптимизация и производительность

Для сложных сцен XR важно учитывать нагрузку:

  • Использовать scene.autoClearDepthAndStencil и scene.autoClear для управления очисткой буфера.
  • Ограничивать количество активных событий на каждый кадр.
  • Профилировать обновление объектов через onXRFrameObservable и выносить тяжелые вычисления в Web Workers.

Интеграция с другими системами Babylon.js

WebXRSessionManager тесно интегрирован с:

  • WebXRFeatureManager для активации дополнительных возможностей, таких как Hand Tracking или Hit Test.
  • WebXRRenderTarget для управления стереоскопическим рендерингом и кастомными шейдерами.
  • Системой материалов и света Babylon.js, чтобы корректно отображать объекты в XR-сцене.

Эта интеграция обеспечивает гибкость и масштабируемость при разработке AR/VR-приложений с Babylon.js.