如何检查两个凸多面体是否在Three.js中相互交叉?

时间:2015-04-26 07:05:16

标签: javascript 3d three.js intersection

我正在研究一个问题,需要随机生成并将凸多面体放入随机选择的点中的立方体/圆柱体容器中而不重叠。我正在使用来获取图形输出。

A demo.

  

在放置多面体时,如何检查它是否与其他多面体相交?

所涉及的凸多面体简单地是四面体或六面体,并使用THREE.ConvexGeometry构造。由于我需要精确检查,边界框是不够的,我只是用它来确保两个多面体没有相交。

我做了很多研究,发现了许多复杂的理论和方法,我需要的是得到一个布尔结果,告诉两个凸多面体之间是否存在交集。 3D中的SAT (Separating Axis Theorem)已经足够了,但Three.js似乎无法做到这一点。谁能告诉我如何以简单的方式进行这种检查,或者只是解释如何在3D中使用SAT进行检查?

2 个答案:

答案 0 :(得分:0)

您可以查看http://www.realtimerendering.com/intersections.html。尽管该网站是从2011年开始的,但交叉算法在过去几年中并未发生变化。从演示中可以看出,一旦将多面体放置在立方体中,它们就不会移动。所以SAT算法不是最好的解决方案,因为它用于移动多面体。

答案 1 :(得分:0)

Gilbert-Johnson-Keerthi是一种强大的算法,可以测量距离并检查凸多面体之间的交点。我仍然相信在简单的多面体上使用它更好,否则支持函数中的计算可能需要一些时间。一个可能的缺点是你需要有能够测量一个点和另一个点/段/三角形之间距离的函数,我不知道是否有一些可用于three.js。

http://en.wikipedia.org/wiki/Gilbert%E2%80%93Johnson%E2%80%93Keerthi_distance_algorithm