Babylon.js предоставляет мощный инструментарий для работы с дополненной реальностью (AR), включая обнаружение плоскостей (plane detection). Этот механизм используется для определения горизонтальных и вертикальных поверхностей в реальном пространстве, что позволяет размещать на них виртуальные объекты.
Обнаружение плоскостей основывается на данных сенсоров устройства,
включая камеру и акселерометр. Babylon.js взаимодействует с WebXR API,
чтобы получать обновления о пространственных поверхностях. Для активации
функции необходимо использовать XRSession с поддержкой
plane-detection.
const xr = await scene.createDefaultXRExperienceAsync({
uiOptions: { sessionMode: "immersive-ar" },
optionalFeatures: ["plane-detection"]
});
Ключевые моменты при работе с plane detection:
onPlaneAddedObservable,
onPlaneUpdatedObservable,
onPlaneRemovedObservable, что позволяет отслеживать
появление и изменения плоскостей в реальном времени.id, положение position, ориентацию
rotationQuaternion и размеры extents.xr.baseExperience.featuresManager.enableFeature(BABYLON.WebXRPlaneDetector, "latest")
.onPlaneAddedObservable.add((plane) => {
console.log("Плоскость обнаружена:", plane.id);
});
Anchor System позволяет привязать виртуальные объекты к конкретной
позиции в AR-сцене, даже если устройство перемещается. В Babylon.js это
реализуется через WebXRAnchorSystem. Является основой для
стабильного отображения объектов на обнаруженных плоскостях.
Создание якоря:
const anchorSystem = xr.baseExperience.featuresManager.enableFeature(
BABYLON.WebXRAnchorSystem, "latest"
);
const anchor = await anchorSystem.addAnchorAtPositionAndRotation(
new BABYLON.Vector3(0, 0, -1),
BABYLON.Quaternion.Identity()
);
const box = BABYLON.MeshBuilder.CreateBox("box", { size: 0.1 }, scene);
anchor.attachedNode = box;
Особенности работы с якорями:
anchorSystem.removeAnchor(anchor) позволяет безопасно
удалить привязку и освободить ресурсы.Эффективное использование AR-сцены требует совместной работы обнаружения плоскостей и системы якорей. Логика обычно строится следующим образом:
onPlaneAddedObservable.onPlaneUpdatedObservable корректируют якорь при изменении
формы плоскости.onPlaneRemovedObservable освобождает якорь, чтобы не
оставлять “висячие” объекты.Пример интеграции:
xr.baseExperience.featuresManager.enableFeature(BABYLON.WebXRPlaneDetector, "latest")
.onPlaneAddedObservable.add(async (plane) => {
const anchor = await anchorSystem.addAnchorAtPositionAndRotation(
plane.position,
plane.rotationQuaternion
);
const sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 0.1 }, scene);
anchor.attachedNode = sphere;
});
onPlaneUpdatedObservable должна ограничиваться лишь нужными
плоскостями, иначе производительность сцены падает.plane-detection и anchors через
xr.baseExperience.sessionManager.features.onAnchorAddedObservable,
onAnchorRemovedObservable позволяют создавать сложные
интерактивные AR-приложения с реакцией на изменения сцены.Использование plane detection совместно с Anchor System формирует фундамент для создания устойчивых и интерактивных AR-сцен в Babylon.js, позволяя виртуальным объектам точно интегрироваться в реальное пространство.