三种JS-移动对象时发生奇怪的光线投射行为

时间:2018-06-29 04:42:29

标签: javascript three.js

版本和信息

THREE.ObjectLoader2: 2.4.1
THREE.LoaderSupport.MeshBuilder: 1.2.1
THREE.LoaderSupport.WorkerSupport: 2.2.0
THREE.WebGLRenderer: 93
THREE.REVISION: 93

问题

当我在场景中射线投射对象时,我发现它可以完美地向下移动到像素,直到移动对象为止。在我的程序中,我加载了场景,因此我将所有对象和子对象移离场景中心。

为了轻松地可视化问题,而不是通过单击鼠标一次广播一个点,我选择对整个屏幕进行射线广播,这就是我所得到的(图1)

Figure 1

(图1) 出现间隙的原因是因为射线影射每个像素花费了很长时间,所以我每四分之一射线影射。中间出现间隙的原因是因为我缩小了原始位置。

现在,看看当我加载对象时会发生什么(图2)

Figure 2

(图2) 如您所见,几乎有一个圆圈。为什么会这样?

我尝试过的事情

我在互联网上尝试了许多事情,当我找不到更多东西时来到这里。

我尝试了各种不同的模型,其中有些工作与其他工作不同,这很奇怪。在Blender中创建的lamborghini-aventador最奇怪。

要查看扩展代码是否有问题,我将该对象移至右侧。这就是使事情变得有趣的地方(图3)。

Figure 3

(图3) 看来我放在对象上的轮廓(轮廓是EdgesGeometry)在后面,实际对象在中间,射线投射在更远的地方。

我的猜测

我怀疑问题与缩放有关。因此,我尝试删除代码中所做的所有缩放,但是不幸的是,我得到了相同的结果。

很抱歉,这是一个noobie错误,尽管我希望是:)

代码

对于那些敢于探究我糟糕的代码库的人来说,这里就是(大多数代码在demo.js内部):

github

测试

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(更新矩阵)

http://barkofthebyte.azurewebsites.net/post/2014/05/05/three-js-projecting-mouse-clicks-to-a-3d-scene-how-to-do-it-and-how-it-works(逐步进行)

...还有更多...

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为您的模型可能没有生成适当的边界框/球体。 圆形可能是由于光线通过的边界球的边界球检查过小而造成的。

您提到以某种方式调整/处理几何的大小...完成之后,请尝试调用geometry.computeBoundingBox()和geometry.computeBoundingSphere()重建框和球体,看看是否有帮助?

编辑:显然,此问题是由于没有重新计算边界框和球体...

解决方法是:

scene.traverse( (o)=>if(o.geometry){o.geometry.computeBoundingBox();o.geometry.computeBoundingSphere();} );