Компонент raycaster предназначен для определения
пересечений луча с объектами сцены, что позволяет реализовывать
интерактивность в VR и 3D-пространствах. Луч создается от позиции
сущности и может быть направлен в конкретном направлении. Наиболее часто
используется для имитации указки, контроля движений или выделения
объектов.
Синтаксис подключения компонента:
<a-entity raycaster="objects: .clickable; far: 10;"></a-entity>
Здесь objects определяет CSS-класс объектов, с которыми
луч будет взаимодействовать, а far задает максимальную
дальность луча.
raycaster1. objects Определяет фильтр объектов,
с которыми луч может пересекаться. Значение задается как CSS-селектор.
Пример:
<a-entity raycaster="objects: .interactive;"></a-entity>
Только объекты с классом interactive будут
отслеживаться. Можно указать несколько классов через запятую:
".interactive, .clickable".
2. far и near Определяют
дальность действия луча:
far — максимальное расстояние пересечения.near — минимальное расстояние, с которого луч начинает
взаимодействовать.Пример:
<a-entity raycaster="far: 20; near: 0.5;"></a-entity>
3. interval Частота обновления
пересечений в миллисекундах. По умолчанию 0, что означает обновление на
каждом кадре. Используется для оптимизации производительности.
4. showLine и lineColor
Позволяют визуализировать луч:
showLine: true — отображает линию луча.lineColor: red — задает цвет линии.<a-entity raycaster="showLine: true; lineColor: blue;"></a-entity>
5. direction Определяет направление
луча относительно локальной системы координат сущности. Формат:
x y z.
<a-entity raycaster="direction: 0 0 -1;"></a-entity>
По умолчанию луч направлен вдоль отрицательной оси Z сущности.
6. objects vs recursive
Параметр recursive: true позволяет лучу проверять
пересечения с дочерними объектами группы. Без него пересечения
фиксируются только на верхнем уровне объектов.
Raycaster генерирует несколько событий для работы с пересечениями:
raycaster-intersected — объект пересекается с лучом
впервые.raycaster-intersected-cleared — луч больше не
пересекается с объектом.raycaster-intersection — событие каждого кадра при
пересечении объекта.Пример использования:
<a-entity id="cursor" raycaster="objects: .interactive"></a-entity>
<script>
const cursor = document.querySelector('#cursor');
cursor.addEventListener('raycaster-intersected', (evt) => {
console.log('Пересечение с:', evt.detail.el);
});
cursor.addEventListener('raycaster-intersected-cleared', (evt) => {
console.log('Прекращение пересечения с:', evt.detail.el);
});
</script>
События evt.detail содержат объект el, с
которым произошло пересечение, и массив всех объектов, находящихся в
зоне действия луча.
Классы для выбора объектов: Все объекты, с которыми необходимо взаимодействовать, следует помечать определенным классом:
<a-box class="interactive" position="0 1 -3"></a-box>
<a-sphere class="interactive" position="2 1 -4"></a-sphere>
Привязка к курсору или контроллеру: Луч чаще всего
размещается на сущности курсора (a-cursor) или на
VR-контроллере:
<a-entity laser-controls="hand: right" raycaster="objects: .interactive"></a-entity>
В таком случае raycaster динамически обновляется вместе
с движением руки.
Использование нескольких лучей: Можно создать
несколько сущностей с raycaster, чтобы отслеживать разные
группы объектов. Это особенно удобно в сложных сценах с разными слоями
интерактивности.
interval > 0 уменьшает нагрузку на
рендеринг.objects конкретными классами снижает
количество проверок.far следует использовать минимально
необходимый для взаимодействия.recursive: false, если нет вложенных объектов, ускоряет
вычисления.animation или изменения
материалов через material.color.objects и события позволяют определить все объекты под
лучом и обрабатывать их по приоритету или дистанции.cursor.addEventListener('raycaster-intersection', (evt) => {
evt.detail.els.forEach(el => {
el.setAttribute('material', 'color', 'yellow');
});
});
ammo.js или cannon.js луч может проверять
столкновения объектов с физическими телами, расширяя возможности
интерактивности.showLine и lineColor.interval и far.Эффективное использование raycaster в A-Frame
обеспечивает надежную интерактивность и гибкость управления
взаимодействием с 3D-объектами.