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

时间:2014-04-05 02:29:12

标签: javascript three.js

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

tube_color - 显然,管的颜色,
spline_points - 大量的THREE.Vector3对象,
细分 radiusSegments 只是数字

    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);

至少可以找到与立方区域相交的对象(网格)?我知道在场景对象中我有所有网格,我可以迭代它们,得到顶点,如果至少有一个点在立方区域内,则用条件迭代它们。 但我相信 ...我希望有一个方法/算法 / magic 比这简单得多......

1 个答案:

答案 0 :(得分:1)

正如@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 )

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