获取区域(3d 立方体)中的所有对象(网格)

Get all objects(meshes) in the area (3d cube)

本文关键字:对象 网格 3d 立方体 获取 区域      更新时间:2023-09-26

我有一个管子系统。更准确地说,我从这段代码创建了一个管子

tube_color - 显然,管子的颜色,
spline_points - 大量的三个。矢量3对象,
半径段只是数字

    var material = new THREE.MeshLambertMaterial( { color: tube_color, shading: THREE.SmoothShading } );
    var spline = new THREE.SplineCurve3(spline_points);
    var tube = new THREE.TubeGeometry(spline, segments, 10, radiusSegments, false, false);
    var tubeMesh = new THREE.Mesh(tube, material);
    scene.add(tubeMesh);

此代码在空间中创建一个特定的网格对象。对于每个网格,我可以使用 myMesh.geometry.vertices 拥有一个 Vector3 数组。
问题是:我在3D空间中具有要点。在这一点上,我创建了Cube,它确实与管子相交。例如,可以像这样创建此立方体

    var cube = new THREE.CubeGeometry(xSize,ySize,zSize, 5, 5, 5);
    var material = new THREE.MeshBasicMaterial({
        color: 0xff0000,
        opacity: 1,
        wireframe: true,
        transparent: false
    });
    var selectionMesh = new THREE.Mesh(cube, material);
    scene.add(selectionMesh);

是否有可能至少找到与立方面积相交的对象(网格)?我知道在场景对象中我有所有的网格,我可以迭代它们,获取顶点,迭代它们,如果至少有一个它的点在立方面积上,则有一个条件。但我相信...我希望有一种方法/算法/魔法比这个更简单......

正如@WestLangley所建议的那样,这个问题的解决方案是构建八叉树。

octree=new THREE.Octree({
      undeferred:false,
      depthMax:Infinity,
      objectsThreshold:8,
      overlapPct:0.15
    } );

并搜索它

var meshesSearch=octree.search( rayCaster.ray.origin, radiusSphere, true, rayCaster.ray.direction ); 

但是,要有特定的交集,我们需要提供递归标志

raycaster.intersectOctreeObjects( objects, true )

我最终对我的具体情况进行了更复杂的处理,但这足以解决当时的问题。