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

521 阅读1分钟
  1. 控制阈值, 光线投射器与对象相交时的精度:raycaster.params.Line.threshold = 0.05 ;
  2. 如何将2d视口的x和y坐标转换成three.js场景中的3d坐标。

getBoundingClientRect() 用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

mouse.x = ((event.clientX - el.getBoundingClientRect().left) / el.offsetWidth) * 2 - 1;
mouse.y = -((event.clientY - el.getBoundingClientRect().top) / el.offsetHeight) * 2 + 1;
  1. 对于点模型:可设置raycaster.params.Points.threshold, 它表示在检测到模型的顶点集合是一个点云(PointCloud)时,Raycaster检测器所使用的精度(即点与光线相交判定的距离)阈值。当我们使用Raycaster检测点云时,这个 threshold 属性将会影响到 Raycaster 的路径长度判断,从而影响到最近像素上准确的点精度。如果一个点与光线的距离小于这个属性的值,那么这个点将会被视为相交点并被返回到 intersects 中
  2. 对于线模型:可设置raycaster.linePrecision, 默认值为1。它表示在计算射线和线段相交时,额外添加的线段厚度。当我们设置该属性的值时,它将会以单位长度为线段的厚度,并将其添加到线段的两侧,以扩大检测范围。该值越小,检测范围越小,可能会出现未检测到相交的情况;该值越大,则检测范围越大,但可能出现误检的情况。所以需要在具体应用时进行合理的设置。
  3. 由于浏览器页面缩放造成获取到的canvas宽高不符,需乘以缩放比例。