版本和信息
THREE.ObjectLoader2: 2.4.1
THREE.LoaderSupport.MeshBuilder: 1.2.1
THREE.LoaderSupport.WorkerSupport: 2.2.0
THREE.WebGLRenderer: 93
THREE.REVISION: 93
问题
当我在场景中射线投射对象时,我发现它可以完美地向下移动到像素,直到移动对象为止。在我的程序中,我加载了场景,因此我将所有对象和子对象移离场景中心。
为了轻松地可视化问题,而不是通过单击鼠标一次广播一个点,我选择对整个屏幕进行射线广播,这就是我所得到的(图1)
(图1) 出现间隙的原因是因为射线影射每个像素花费了很长时间,所以我每四分之一射线影射。中间出现间隙的原因是因为我缩小了原始位置。
现在,看看当我加载对象时会发生什么(图2)
(图2) 如您所见,几乎有一个圆圈。为什么会这样?
我尝试过的事情
我在互联网上尝试了许多事情,当我找不到更多东西时来到这里。
我尝试了各种不同的模型,其中有些工作与其他工作不同,这很奇怪。在Blender中创建的lamborghini-aventador
最奇怪。
要查看扩展代码是否有问题,我将该对象移至右侧。这就是使事情变得有趣的地方(图3)。
(图3) 看来我放在对象上的轮廓(轮廓是EdgesGeometry)在后面,实际对象在中间,射线投射在更远的地方。
我的猜测
我怀疑问题与缩放有关。因此,我尝试删除代码中所做的所有缩放,但是不幸的是,我得到了相同的结果。
很抱歉,这是一个noobie错误,尽管我希望是:)
代码
对于那些敢于探究我糟糕的代码库的人来说,这里就是(大多数代码在demo.js
内部):
测试
按G
进行射线广播(会冻结一段时间),按X
进行加载,按S
进行卸载。标准轨道控制。
我发现的东西
以下是我已经找到并尝试解决此问题的一些链接:
https://threejs.org/docs/#api/core/Raycaster
Three.js Raycaster not detecting scene mesh
https://github.com/mrdoob/three.js/issues/1325(更新矩阵)
...还有更多...
有什么想法吗?
答案 0 :(得分:1)
我认为您的模型可能没有生成适当的边界框/球体。 圆形可能是由于光线通过的边界球的边界球检查过小而造成的。
您提到以某种方式调整/处理几何的大小...完成之后,请尝试调用geometry.computeBoundingBox()和geometry.computeBoundingSphere()重建框和球体,看看是否有帮助?
编辑:显然,此问题是由于没有重新计算边界框和球体...
解决方法是:
scene.traverse( (o)=>if(o.geometry){o.geometry.computeBoundingBox();o.geometry.computeBoundingSphere();} );