#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()
это именно то, что мне было нужно. К сожалению, я не смог найти никакой информации об этом в документации. Спасибо!