【问题标题】:three.js - Get all objects(meshes) in the area (3d cube)three.js - 获取区域内的所有对象(网格)(3d 立方体)
【发布时间】:2014-05-17 12:56:05
【问题描述】:

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

tube_color - 显然,管的颜色,
spline_points - 大量的 THREE.Vector3 对象, i>
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);

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

【问题讨论】:

  • 如果你有很多点,八叉树可能会有所帮助:threejs.org/examples/webgl_octree.html
  • 好的,谢谢你的建议,我会在下周检查这个。
  • @WestLangley,非常感谢!它几乎完美无缺!抱歉耽搁了 - 我正在尝试不同的方法来解决这个问题。你能帮我处理八叉树吗:meshesSearch = octree.search( rayCaster.ray.origin, radiusSphere, true, rayCaster.ray.direction ); 它向我展示了例如 2 个对象(网格),但 intersections = rayCaster.intersectOctreeObjects( meshesSearch); 有时(我猜是随机的)显示 1 个交叉点,有时显示 0。但是应该至少有 1 个交叉点...
    我正在使用从顶点添加节点
  • 也许你需要传递递归标志? raycaster.intersectOctreeObjects( objects, true )。如果没有,你只需要使用调试器慢慢地单步调试代码,看看你是否能找到问题所在。用一个很简单的案例来测试,这样就可以验证逻辑了。
  • @WestLangley,您能否将您的评论移至答案。它完美地完成了我想做的事情!

标签: javascript three.js


【解决方案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 )

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2014-04-28
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多