我正在尝试在一个方向范围内沿着平面找到从点到大型复杂网格的最近距离:

 for (var zDown in verticalDistances) {
    var myIntersect = {};
   for (var theta = Math.PI / 2 - 0.5; theta < Math.PI / 2 + 0.5; theta += 0.3) {
                var rayDirection = new THREE.Vector3(
                    Math.cos(theta),
                    Math.sin(theta),
                    0
                ).transformDirection(object.matrixWorld);
                 //  console.log(rayDirection);

                _raycaster.set(verticalDistances[zDown].minFacePoint, rayDirection, 0, 50);
                //  console.time('raycast: ');
                var intersect = _raycaster.intersectObject(planeBufferMesh);
                //   console.timeEnd('raycast: '); // this is huge!!! ~ 2,300 ms

                //   console.log(_raycaster);
                //    console.log(intersect);
                if (intersect.length == 0) continue;
                if ((!('distance' in myIntersect)) || myIntersect.distance > intersect[0].distance) {
                    myIntersect.distance = intersect[0].distance;
                    myIntersect.point = intersect[0].point.clone();
                }
            }
// do stuff
}


当鼠标悬停在同一表面上时,我得到了很好的结果,但是执行此循环时,每次投射光线投射要花费2秒钟以上。我唯一能想到的是DoubleSide Material的背面要慢一吨?

我还注意到,当我将我的verticalDistances [zDown] .minFacePoint间隔开时,光线投射开始加速(500毫秒/ cast)。因此,随着verticalDistances [i] .minFacePoint和verticalDistances [i + 1] .minFacePoint之间的距离增加,光线投射器的执行速度会更快。

我会选择使用octree的路线,但是鼠标悬停事件在完全相同的planeBuffer上效果非常好。这是实质问题的一面吗?可以通过加载2个指向相反方向的FrontSide网格来解决?

谢谢!!!!

编辑:这不是前后问题。我沿着平面缓冲区几何的正面和背面进行了射线投射,并得到了相同的光斑结果。现场示例即将到来。

编辑2:工作示例here。性能比原始情况好一点,但仍然太慢。我需要实时移动气缸。我可以通过找到某些东西来优化一点,但是鼠标悬停是即时的。当您查看控制台时间时,前两个(500ms)就是我要获得的所有结果。

编辑3:添加了一个鼠标悬停事件,其执行与其他raycasters相同。我没有在本示例中获得的工作代码中获得结果。对于所有射线广播,我得到的结果与在500毫秒左右的样本中第一个1或2得到的结果相同。如果我可以将其降低到200毫秒,那么我可以瞄准我要寻找的物品,并减少射线投射。我完全愿意接受有关更好方法的建议。八叉树走的路吗?

raycast: : 467.27001953125ms
raycast: : 443.830810546875ms


编辑4:@pailhead这是我的计划。
1.找到最接近的网格顶点以指向平面。我可以在x / y方向上扫描顶点,然后计算最小距离。
2.一旦有了最接近的顶点,我便知道我的最接近点必须在包含该顶点的面上。因此,我将使用object.mesh.index.array查找具有该顶点的所有面,并计算指向每个面的点的平面。当与网格相交并且至少基于最大距离剔除点时,似乎射线投射应该比完全扫描更聪明? @WestLangley有什么建议吗?

编辑5:
@pailhead谢谢您的帮助。它的赞赏。我真的简化了我的example
编辑6:看起来所有网格在raycast函数中都被视为相同。这意味着它不会聪明地寻找平面缓冲几何形状的区域。查看mesh.js行266,我们遍历整个索引数组。我猜对于常规网格,您不知道什么面在哪里,因为它是TIN,但是planeBuffer确实可以使用边界框/球面规则,因为您的x / y是已知的顺序位置,而只有Z是未知的。最后编辑,下一个将是答案

最佳答案

仅供参考:为了获得最大速度,您可以使用数学运算。无需使用射线投射。 https://brilliant.org/wiki/3d-coordinate-geometry-equation-of-a-plane/

09-25 16:06