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

时间:2019-03-27 14:48:29

标签: javascript three.js aframe raycasting

我希望我的光线投射器仅在按下我的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,但结果仍然相同。

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

编辑:

如果我在triggerup部分中寻找交叉点,那么它会起作用。但这是一种解决方法,也使我无法使用相交的元素并在按住触发器的同时执行操作。我仍然想知道为什么启用ray / change目标对象并立即查找相交会不起作用。

1 个答案:

答案 0 :(得分:0)

我建议使用raycaster.enabled属性,而不是交换为虚拟类。

光线投射器每帧检查相交一次(或任何raycaster.interval是)。向下触发时,启用光线投射器,但必须等到下一帧才能拾取光线。

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