Babylon.js предоставляет мощный инструментарий для создания AR-приложений с использованием WebXR. Одним из ключевых элементов современных AR-интерфейсов является возможность интеграции DOM-элементов поверх 3D-сцены, сохраняя их привязку к виртуальным объектам или пространству реального мира. Эта функциональность реализуется через DOM Overlay.
DOM Overlay позволяет накладывать стандартные HTML-элементы поверх канваса Babylon.js, при этом элементы остаются интерактивными и реагируют на события браузера. В AR-режиме это особенно важно, поскольку часто требуется создавать пользовательские интерфейсы, всплывающие подсказки или панели управления, которые остаются видимыми и доступными независимо от движения камеры.
В Babylon.js DOM Overlay поддерживается через включение соответствующего слоя при инициализации XR-сессии:
const xr = await scene.createDefaultXRExperienceAsync({
uiOptions: { sessionMode: 'immersive-ar' }
});
xr.baseExperience.sessionManager.onXRSessionInit.add(() => {
xr.baseExperience.featuresManager.enableFeature(
BABYLON.WebXRFeatureName.DOM_OVERLAY,
'latest',
{
rootNode: document.getElementById('ui-container')
}
);
});
rootNode — HTML-элемент, который будет
служить контейнером для всех DOM-элементов, накладываемых на сцену.sessionMode: 'immersive-ar' —
обязательный режим для работы в AR.DOM Overlay в Babylon.js позволяет не только фиксировать интерфейс в
центре экрана, но и привязывать элементы к конкретным объектам сцены.
Для этого используется компонент
WebXRDOMOverlayFeature вместе с объектом
BABYLON.TransformNode.
Пример привязки подсказки к 3D-объекту:
const box = BABYLON.MeshBuilder.CreateBox("box", {}, scene);
const domElement = document.createElement("div");
domElement.className = "label";
domElement.innerText = "Привет, AR!";
document.getElementById("ui-container").appendChild(domElement);
const domOverlay = xr.baseExperience.featuresManager.getEnabledFeature(BABYLON.WebXRFeatureName.DOM_OVERLAY);
domOverlay.addAnchorForElement(domElement, box);
addAnchorForElement обеспечивает
позиционирование DOM-элемента в 3D-пространстве.DOM Overlay поддерживает стандартные события DOM, такие как
click, mouseover, touchstart. Это
позволяет создавать интерактивные элементы интерфейса:
domElement.addEventListener("click", () => {
console.log("Элемент нажат!");
box.rotation.y += Math.PI / 4;
});
Элементы остаются полностью функциональными даже при активном AR-режиме, что делает возможным создание меню, кнопок и ползунков, интегрированных в 3D-сцену.
При работе с DOM Overlay необходимо учитывать производительность:
transform: translate3d(...)) вместо изменения
top и left.DOM Overlay предоставляет возможность создавать любые элементы интерфейса: текстовые подсказки, кнопки управления, индикаторы состояния. Например, можно создать панель с информацией о объекте:
<div id="ui-container">
<div class="info-panel">
<h2>Объект AR</h2>
<p>Описание и свойства объекта</p>
</div>
</div>
.info-panel {
background: rgba(0, 0, 0, 0.6);
color: white;
padding: 8px;
border-radius: 5px;
pointer-events: auto;
}
Элементы панели будут привязаны к объектам сцены через
addAnchorForElement, создавая ощущение естественного
взаимодействия с виртуальными объектами.
DOM Overlay позволяет обновлять контент элементов в реальном времени. Это полезно для отображения информации о состоянии сцены, позициях объектов или других динамических данных:
scene.onBeforeRenderObservable.add(() => {
domElement.innerText = `Позиция: ${box.position.x.toFixed(2)}, ${box.position.y.toFixed(2)}, ${box.position.z.toFixed(2)}`;
});
Обновление текста или стиля происходит синхронно с кадрами сцены, что обеспечивает актуальность информации.
Использование DOM Overlay в AR-режиме Babylon.js позволяет объединить удобство стандартного HTML-интерфейса с интерактивностью и пространственной привязкой 3D-объектов. Это решение подходит как для образовательных, так и для коммерческих AR-приложений, обеспечивая гибкость дизайна и лёгкость взаимодействия.