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.WebXRSessionManager предоставляет методы для запуска и
завершения сессии:
sessionManager.initializeAsync().then(() => {
console.log("Сессия инициализирована");
});
sessionManager.exitXRAsync().then(() => {
console.log("Сессия завершена");
});
Особенности:
initializeAsync() запускает XR-сессию с текущими
настройками сцены и камер.exitXRAsync() корректно завершает сессию, освобождая
ресурсы и отключая рендеринг XR.sessionManager.sessionRunning, которое возвращает
true при активной XR-сессии.Менеджер поддерживает подписку на ключевые события:
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);
});
Особенности ввода:
onControllerAddedObservable.motionController каждого контроллера.sessionManager.input.onControllerRemovedObservable
позволяет корректно обрабатывать отключение устройств.WebXRSessionManager универсален для VR и AR:
"immersive-vr" с полным контролем
сцены."immersive-ar" с возможностью
смешивать 3D-объекты с реальным миром, получаемым через камеру
устройства.referenceSpaceType
("local" или "local-floor") для корректного
позиционирования объектов.Для сложных сцен XR важно учитывать нагрузку:
scene.autoClearDepthAndStencil и
scene.autoClear для управления очисткой буфера.onXRFrameObservable и выносить тяжелые вычисления в Web
Workers.WebXRSessionManager тесно интегрирован с:
WebXRFeatureManager для активации дополнительных
возможностей, таких как Hand Tracking или Hit Test.WebXRRenderTarget для управления стереоскопическим
рендерингом и кастомными шейдерами.Эта интеграция обеспечивает гибкость и масштабируемость при разработке AR/VR-приложений с Babylon.js.