Hit testing — это процесс определения пересечения луча (ray) с объектами или поверхностями в 3D-пространстве. В контексте A-Frame используется для взаимодействия с виртуальными объектами, определения точек на плоскостях и создания AR/VR-интерфейсов. Основной механизм опирается на raycaster и геометрию сцены.
В A-Frame hit testing может применяться как в классическом VR, так и в AR-сценах с поддержкой WebXR.
Компонент raycaster является основным инструментом для
hit testing:
<a-entity id="cursor" raycaster="objects: .interactable"></a-entity>
Пример отслеживания пересечения:
const cursor = document.querySelector('#cursor');
cursor.addEventListener('raycaster-intersection', function (evt) {
const intersections = evt.detail.intersections;
intersections.forEach(intersection => {
console.log('Попадание по объекту:', intersection.object.el.id);
});
});
Событие raycaster-intersection срабатывает при
пересечении луча с любым объектом, указанным в селекторе. Событие
raycaster-intersection-cleared уведомляет о прекращении
пересечения.
В AR-сценах важным аспектом является определение плоскостей, на
которых можно разместить виртуальные объекты. В WebXR это реализуется
через XRHitTestSource, который интегрирован в A-Frame
через компонент ar-hit-test.
Пример компонента для AR-плоскостей:
<a-entity ar-hit-test="targetEl: #marker"></a-entity>
На JavaScript это выглядит так:
AFRAME.registerComponent('ar-hit-test', {
schema: {
targetEl: {type: 'selector'}
},
init: function () {
const el = this.el;
const target = this.data.targetEl;
navigator.xr.requestSession('immersive-ar', {requiredFeatures: ['hit-test']})
.then(session => {
const viewerSpace = session.viewerSpace || session.requestReferenceSpace('viewer');
const hitTestSourcePromise = session.requestHitTestSource({space: viewerSpace});
hitTestSourcePromise.then(hitTestSource => {
session.requestAnimationFrame((time, frame) => {
const hitTestResults = frame.getHitTestResults(hitTestSource);
if (hitTestResults.length > 0) {
const hit = hitTestResults[0];
const pose = hit.getPose(el.sceneEl.renderer.xr.getReferenceSpace());
target.object3D.position.copy(pose.transform.position);
target.object3D.quaternion.copy(pose.transform.orientation);
}
});
});
});
}
});
Эта логика позволяет объекту следовать за точкой пересечения с реальной плоскостью, обеспечивая естественное позиционирование в AR.
При использовании hit testing важно учитывать:
objects можно
ограничить пересечение только интерактивными объектами.tick или через
requestAnimationFrame.Пример фильтрации объектов по тегу:
cursor.addEventListener('raycaster-intersection', (evt) => {
const interactables = evt.detail.intersections.filter(i => i.object.el.classList.contains('interactable'));
interactables.forEach(i => console.log('Доступный объект:', i.object.el.id));
});
Hit testing активно используется для:
far и near для
raycaster, чтобы исключить ненужные пересечения.Hit testing в A-Frame — мощный инструмент для взаимодействия с 3D-сценой и AR-приложениями, позволяющий создавать динамические, точные и интерактивные элементы интерфейса.