如何更新AFRAME的Raycaster交点?解决模型部件点击识别焦点问题
解决AFR Raycaster切换模型部件无需失焦即可更新交点的问题
你的问题出在只使用了raycaster-intersected事件——这个事件仅在射线首次命中模型时触发一次,当鼠标在模型内部的不同部件间移动时,不会再次触发该事件,所以你的self.mousedown始终保留着第一次命中的部件名,必须移出模型再移入才能重新触发事件更新。
下面提供两种可行的解决方法:
方法一:改用raycaster-intersection事件
这个事件会在射线每帧持续命中模型时触发,可以实时获取当前鼠标指向的部件信息:
AFRAME.registerComponent('model1', { init: function(){ let el = this.el; let self = this; // 替换为raycaster-intersection事件,实时更新交点 el.addEventListener('raycaster-intersection', e => { self.raycaster = e.detail.el; const intersection = self.raycaster.components.raycaster.getIntersection(el); if (intersection) { self.mousedown = intersection.object.name; } }); el.addEventListener('click', function(){ console.log(self.mousedown); }); } })
方法二:在tick方法中主动更新交点
通过组件的tick方法(每帧执行)主动获取最新的交点信息,确保部件名实时更新:
AFRAME.registerComponent('model1', { init: function(){ let el = this.el; let self = this; self.raycaster = null; // 记录raycaster实例 el.addEventListener('raycaster-intersected', e => { self.raycaster = e.detail.el; }); // 射线离开时清空实例 el.addEventListener('raycaster-intersected-cleared', () => { self.raycaster = null; }); }, tick: function(){ if (!this.raycaster) return; // 每帧获取最新交点 const intersection = this.raycaster.components.raycaster.getIntersection(this.el); if (intersection) { this.mousedown = intersection.object.name; } }, // 点击事件绑定到events字段更符合AFR规范 events: { click: function(){ console.log(this.mousedown); } } })
另外注意:你原代码里有一行多余的});,需要删除,否则会导致语法错误。
内容的提问来源于stack exchange,提问作者Frank Leaster
相关产品推荐
相关产品推荐

