Aframe raycaster не срабатывает после изменения включенных свойств или объектов

#javascript #three.js #aframe #raycasting

#javascript #three.js #aframe #raycasting

Вопрос:

Я хочу, чтобы мой raycaster искал пересечения только при нажатии триггера моего контроллера vive. Я подумал инициализировать raycaster с поддельным классом в objects, изменить его на реальный .prop и собрать intersectedEls

 let rightHand = document.getElementById('rightController');
rightHand.setAttribute('line', 'color: purple; opacity: 1;');
rightHand.setAttribute('raycaster', { showLine: true, objects: '.none' });
rightHand.setAttribute('cursor', { downEvents: ['triggerdown'], upEvents: ['triggerup'], rayOrigin: 'entity', fuse: false });

let scene = document.getElementById('scene');
scene.addEventListener('triggerdown', this.myTriggerDown);
scene.addEventListener('triggerup', this.myTriggerUp);

myTriggerDown() {
    let rightHand = document.getElementById('rightController');
    rightHand.setAttribute('raycaster', { showLine: true, objects: '.prop' });
    rightHand.components['raycaster'].refreshObjects();

    let raycaster = rightHand.components['raycaster'];
    let intersectedEls = raycaster.intersectedEls;

    if (typeof intersectedEls !== 'undefined' amp;amp; intersectedEls.length > 0) {
        scene.components['resize'].enableResize(intersectedEls[0]);
    } else {
        console.log('1234 no intersections')
    }
}
myTriggerUp() {
   let rightHand = document.getElementById('rightController');
   rightHand.setAttribute('raycaster', { showLine: true, objects: '.none' });
}
  

К сожалению, я продолжаю получать console.log('1234 no intersections') сообщение.

Я попытался добавить refreshObjects() строку без каких-либо эффектов. Я попытался переключить enabled свойство вместо изменения objects , но результат остался тем же.

Будем признательны за любую помощь. Спасибо

Редактировать:

если я ищу пересечения в части запуска, это работает. но это обходной путь, который также лишает меня возможности использовать элемент intersected и выполнять какие-либо действия, удерживая триггер нажатым. Я все еще хотел бы знать, почему не получается включить ray / изменить целевые объекты и немедленно искать пересечения.

Ответ №1:

Я рекомендую использовать raycaster.enabled свойство вместо замены на фиктивный класс.

Raycaster проверяет наличие пересечений один раз за кадр (или что бы это ни было raycaster.interval ). При нажатии на спусковой крючок вы включаете raycaster, но вам нужно дождаться следующего кадра, чтобы он обнаружил пересечения.

Вы можете вручную вызвать проверку пересечения через raycaster.checkIntersections() или запустить setTimeout перед проверкой.

Комментарии:

1. Я пробовал raycaster.enabled комбинировать с setTimeout , но это все равно не сработало.

2. Это было не мое предложение. Я упоминал о вызове checkIntersections.

3. О! извините, я не заметил. checkIntersections() это именно то, что мне было нужно. К сожалению, я не смог найти никакой информации об этом в документации. Спасибо!