Anchors (якоря) — это механизм пространственной привязки виртуальных объектов к конкретным точкам реального мира в AR-сценариях. В контексте веб-разработки на базе A-Frame якоря используются совместно с WebXR для фиксации виртуальных сущностей в физическом пространстве устройства пользователя.
Технология позволяет:
Работа с якорями невозможна без поддержки WebXR и режима
immersive-ar.
A-Frame функционирует как декларативная надстройка над Three.js. В
AR-режиме используется WebXR Session с типом immersive-ar,
который предоставляет:
<a-scene
xr-mode-ui="enabled: true"
webxr="requiredFeatures: hit-test, local-floor"
>
<a-entity camera></a-entity>
</a-scene>
Параметр requiredFeatures указывает WebXR, какие
возможности обязательны для запуска сессии.
Якорь — это пространственная точка, закреплённая в координатной системе реального мира. Он создаётся на основе:
После создания якорь:
Hit-test — механизм определения точки пересечения виртуального луча (обычно направленного из камеры) с реальной поверхностью.
В A-Frame hit-test реализуется через WebXR API. Пример логики:
hit-test.XRHitTestSource.В чистом A-Frame нет встроенного компонента anchor,
поэтому используется кастомный компонент.
AFRAME.registerComponent('ar-anchor', {
init: function () {
this.el.sceneEl.renderer.xr.addEventListener('sessionstart', async () => {
const session = this.el.sceneEl.renderer.xr.getSession();
const viewerSpace = await session.requestReferenceSpace('viewer');
this.hitTestSource = await session.requestHitTestSource({
space: viewerSpace
});
});
},
tick: function () {
const frame = this.el.sceneEl.frame;
if (!frame || !this.hitTestSource) return;
const referenceSpace = this.el.sceneEl.renderer.xr.getReferenceSpace();
const hitTestResults = frame.getHitTestResults(this.hitTestSource);
if (hitTestResults.length > 0) {
const hit = hitTestResults[0];
const pose = hit.getPose(referenceSpace);
this.el.object3D.position.set(
pose.transform.position.x,
pose.transform.position.y,
pose.transform.position.z
);
}
}
});
Этот компонент:
Для устойчивости позиции создаётся полноценный XRAnchor.
Это снижает дрейф и улучшает стабильность.
Алгоритм:
XRHitTestResult.createAnchor().anchor.anchorSpace.Пример:
const anchor = await hitTestResult.createAnchor();
this.currentAnchor = anchor;
В цикле рендера:
const pose = frame.getPose(
this.currentAnchor.anchorSpace,
referenceSpace
);
WebXR использует различные системы координат:
| Тип | Назначение |
|---|---|
viewer |
Относительно камеры |
local |
Относительно стартовой позиции |
local-floor |
С учётом уровня пола |
bounded-floor |
Ограниченное пространство |
Для AR чаще используется local-floor, поскольку он
стабилизирует высоту сцены.
Некоторые устройства поддерживают обнаружение плоскостей. Это позволяет:
Для активации:
<a-scene webxr="requiredFeatures: hit-test, plane-detection">
После этого через XRFrame.detectedPlanes можно получать
информацию о плоскостях.
Anchors применяются не только для 3D-моделей, но и для интерфейсов:
Пример интерфейсной панели:
<a-entity
geometry="primitive: plane; width: 0.4; height: 0.2"
material="color: #222"
ar-anchor>
</a-entity>
Сценарии:
Структура хранения:
this.anchors = [];
При создании:
this.anchors.push(anchor);
При очистке:
anchor.delete();
Удаление якоря освобождает ресурсы системы трекинга.
Даже при использовании якорей возможны:
Методы минимизации:
XRAnchor;При использовании физических движков (например, cannon.js через A-Frame) необходимо учитывать:
Часто применяется схема:
Современные устройства поддерживают сохранение якорей между сессиями:
WebXR пока не стандартизирует персистентное хранение, поэтому требуется нативная интеграция или сторонние библиотеки.
Поддержка якорей зависит от:
Мобильные браузеры на базе Chromium обеспечивают наиболее стабильную работу AR-сцен с A-Frame.
Рекомендации:
AR-сцены требуют значительно больше вычислительных ресурсов из-за одновременной работы камеры, трекинга и 3D-рендера.
Комбинация WebXR и геоданных позволяет создавать:
Несколько устройств могут:
Для этого требуется сервер синхронизации и передача трансформаций через WebSocket.
A-Frame:
object3D каждого entity.Якоря работают на уровне WebXR, но визуально управляют
object3D внутри A-Frame.
Anchors являются ключевым механизмом построения устойчивых AR-сцен в A-Frame. Они обеспечивают пространственную стабильность, корректное взаимодействие виртуальных объектов с физическим окружением и формируют основу реалистичного дополненного опыта.