В A-Frame управление интерактивностью объектов осуществляется через
систему компонентов, где ключевую роль играет компонент
cursor и события наведения (mouseenter,
mouseleave, click). По умолчанию, все объекты
сцены реагируют на взаимодействие курсора, если на них установлены
соответствующие коллайдеры (geometry +
material) и система raycaster. Для
избирательного отключения реакции на курсор используются специальные
методы и атрибуты компонентов.
raycaster="objects: ..."Компонент raycaster позволяет указать, какие объекты
сцены будут воспринимать луч курсора. Атрибут objects
принимает CSS-подобные селекторы:
<a-entity id="camera" camera look-controls>
<a-entity cursor="fuse: false"
raycaster="objects: .interactive">
</a-entity>
</a-entity>
<a-box class="interactive" position="-1 1 -3" color="#4CC3D9"></a-box>
<a-sphere position="0 1.25 -5" color="#EF2D5E"></a-sphere>
В данном примере:
.interactive будут реагировать
на курсор.a-sphere не имеет класса .interactive,
поэтому на него курсор не реагирует.Ключевой момент: этот способ позволяет централизованно управлять интерактивностью на уровне камеры или курсора, исключая необходимость изменения свойств каждого объекта отдельно.
cursor с фильтром по классамКомпонент cursor может быть расширен дополнительными
условиями с помощью фильтров:
<a-entity cursor="fuse: true; fuseTimeout: 500"
raycaster="objects: .clickable">
</a-entity>
<a-box class="clickable" position="1 1 -4" color="#FFC65D"></a-box>
<a-cylinder position="2 0.75 -3" color="#7BC8A4"></a-cylinder>
fuse включает автоклик при наведении на
объект.objects: .clickable исключает все объекты без этого
класса..clickable полностью игнорируются
курсором, оставаясь визуально активными в сцене.Для сценариев, когда объект должен быть видимым, но недоступным для
курсора, применяется атрибут pointer-events CSS или
отключение коллайдера через компонент geometry:
<a-box position="0 1 -3" color="#FF0000"
class="no-cursor"
material="color: red; opacity: 0.8"
geometry="primitive: box; pointerEvents: none">
</a-box>
Если pointerEvents: none не поддерживается напрямую,
можно использовать модификацию через raycaster:
<a-box position="-2 1 -3" color="#00FF00"
class="ignore-ray"></a-box>
<script>
const ignore = document.querySelectorAll('.ignore-ray');
ignore.forEach(el => {
el.setAttribute('raycaster-ignore', true);
});
</script>
raycaster-ignore, который при инициализации исключает
объект из луча курсора.no-cursorСоздание собственного компонента обеспечивает гибкость и чистоту сцены:
AFRAME.registerComponent('no-cursor', {
init: function () {
this.el.classList.add('ignore-ray');
}
});
Использование:
<a-box position="0 2 -5" color="#0000FF" no-cursor></a-box>
no-cursor автоматически
исключаются из взаимодействия курсора.raycaster="objects: .interactive" для полной
избирательности.Иногда требуется временно отключить курсор для объекта при определенных условиях:
const box = document.querySelector('#myBox');
box.addEventListener('mouseenter', () => {
console.log('Этот объект больше не будет реагировать на курсор.');
box.removeAttribute('raycaster'); // Полное отключение
});
raycaster с объекта делает его
невидимым для всех лучей.raycaster и
улучшает производительность.raycaster и кастомные компоненты типа
no-cursor.Методы отключения курсора для отдельных объектов в A-Frame обеспечивают тонкую настройку интерактивности, позволяя создавать сложные VR-сцены с управляемым поведением каждого элемента.