我有一个管系统。更确切地说,我从这段代码中创建了一个管子
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 比这简单得多......
答案 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 )
我最后对我的具体案例进行了更复杂的处理,但这足以解决当时的问题。