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

How to check if two convex polyhedrons intersect with each other in Three.js?

我正在解决一个问题,需要随机生成凸多面体并将其放入 cube/cylinder 容器中随机选择的点而不重叠。我正在使用 来获得图形输出。

A demo.

While putting a polyhedron, how to check whether it intersects with other polyhedrons?

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

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

你可以看看http://www.realtimerendering.com/intersections.html。尽管该网站是从 2011 年开始的,但路口算法在过去几年中没有改变。从演示中可以看出,一旦将多面体放入立方体中,它们就不会移动。所以 SAT 算法不是最好的解决方案,因为它用于移动多面体。

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

中是否有一些函数可用

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