Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 三个JS-移动对象时奇怪的光线投射行为_Javascript_Three.js - Fatal编程技术网

Javascript 三个JS-移动对象时奇怪的光线投射行为

Javascript 三个JS-移动对象时奇怪的光线投射行为,javascript,three.js,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 问题 当我在我的场景中对一个对象进行光线投射时,我发现它可以完美地工作到像素,直到我移动该对象为止。在我的程序中,我分解场景,因此我将所有对象和子对象移离场景中心 为了方便地可视化问题,

版本和信息

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中创建的
兰博基尼aventador
工作最奇怪

为了查看分解代码是否有问题,我将对象移到了右侧。这就是事情变得有趣的地方(图3)

(图3) 看起来我的外加对象(轮廓是一个几何图形)在后面,实际的物体在中间,并且光线投射进一步。

我的推测

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

道歉,如果这是一些琐碎的错误,但我希望是:)

代码

对于那些敢于钻研我糟糕的代码库的人来说,这里是(大部分代码都在
demo.js
中):

测试它

G
拍摄光线投射(将冻结一段时间),按
X
进行爆炸,按
S
进行未爆炸。标准轨道控制

我的发现

以下是我已经找到并尝试过的有关此问题的一些链接:

(更新矩阵)

(一步一步)

。。。还有更多


有什么想法吗?

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

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

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

解决办法是:


遍历((o)=>if(o.geometry){o.geometry.computeBoundingBox();o.geometry.computeBoundingSphere();});

就可以了!当我试过之后,我会在评论中回复你:)啊,不幸的是,这没有起作用:(我计算了边界区域(长方体和球体)对于场景中的每个对象和子对象,仍然是相同的结果,这确实是一个棘手的问题!我不知道!它似乎解释了工件的循环性质!您是如何使用scene.traverse((o)=>if(o.geometry){o.geometry.computeBoundingBox();o.geometry.computeBoundingSphere();});?酷的可视化btw:)另外,您是否在代码中的任何地方设置matrixAutoUpdate=false?也许矩阵没有更新?