关于Three.js THREE.Raycaster射线拾取不准确的原因

这篇博客探讨了在three.js中如何利用THREE.Raycaster进行3D交互,特别是在将2D视口的坐标转换为3D场景坐标时的方法。通过设置raycaster.params.Line.threshold来控制线的精度,并详细展示了如何通过鼠标事件获取2D坐标并转换为3D世界坐标。此外,还讨论了全屏canvas的情况以及如何进行鼠标点击的处理,以实现与场景中对象的精确交互。

首先要关注THREE.Raycaster的属性,从three.js官网给出的例子[webgl_interactive_lines.html]可以得知此函数,可以控制线的精确度。

raycaster.params.Line.threshold = 0.05 ;

由于浏览器是一个2d视口,而在里面显示three.js的内容是3d场景,所以,现在有一个问题就是如何将2d视口的xy坐标转换成three.js场景中的3d坐标。

然后要关注是否是全屏的canvas。

    spriteClick: function (event) {
       event.preventDefault();
      // 鼠标转换三维坐标
      // this.mouse.x = (event.clientX / document.getElementById("other").offsetWidth) * 2 - 1;
      // this.mouse.y = -(event.clientY / document.getElementById("other").offsetHeight) * 2 + 1;

     //this.mouse.x =   ( event.offsetX / this.goldenContainer.width ) * 2 - 1;
    //this.goldenContainer.width 当前画布的高
    // this.mouse.y = - (event.offsetY / this.goldenContainer.height) * 2 + 1;
    //this.goldenContainer.height 当前画布的宽

      this.mouse.x = ((event.clientX - document.getElementById("deviceCanvas").getBoundingClientRect().left) / document.getElementById("deviceCanvas").offsetWidth) * 2 - 1;
      this.mouse.y = -((event.clientY - document.getElementById("deviceCanvas").getBoundingClientRect().top) / document.getElementById("deviceCanvas").offsetHeight) * 2 + 1;

      let standardVector = new THREE.Vector3(this.mouse.x, this.mouse.y, 1);// 标准设备坐标
      // 标准设备坐标转世界坐标
      let worldVector = standardVector.unproject(this.camera);
      // 射线投射方向单位向量(worldVector坐标减相机位置坐标)
      let ray = worldVector.sub(this.camera.position).normalize();
      this.raycaster = new THREE.Raycaster(this.camera.position, ray);
      // 设置要获取的相交对象(数组)
      const objs = this.raycaster.intersectObjects(meshList, true);
      if (objs.length > 0) {
        // code......
      }
    },

评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值