更改启用或对象属性后,Aframe raycaster不会命中

问题描述 投票:0回答:1

我希望我的raycaster只有在按下我的vive控制器的触发器时才能查找交叉点。我想用物体中的假类来初始化raycaster,将其改为真正的.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' && 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,但仍然有相同的结果。

任何帮助,将不胜感激。谢谢

编辑:

如果我在触发器部件中查找交叉点,则可以正常工作。但这是一种解决方法,也使我无法使用交叉元素并在保持按下触发器的同时做事。我仍然想知道为什么它无法启用光线/更改目标对象并立即查找交叉点。

javascript three.js aframe raycasting
1个回答
0
投票

我建议使用raycaster.enabled属性与交换到虚拟类。

raycaster每帧检查一次交叉点(或者无论raycaster.interval是什么)。在触发下降时,启用raycaster,但您必须等到下一帧才能获取交叉点。

你可以通过raycaster.checkIntersections()手动调用交叉点检查,或者在检查之前运行setTimeout

© www.soinside.com 2019 - 2024. All rights reserved.