【发布时间】: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