在3d中查找2个任意立方体的交集

时间:2013-07-09 20:59:22

标签: java 3d geometry intersection

所以,我想弄清楚一个函数,它允许你确定两个任意旋转和大小的立方体是否相交。

如果立方体的旋转不是任意的(但是锁定到特定轴),则交叉点很简单;通过检查它们的界限来检查它们是否在所有三个维度中交叉,以查看它们是否在所有三个维度中交叉或在彼此之内。如果它们交叉或仅在两个内,它们不相交。此方法可用于确定任意立方体是否是交集的候选对象,使用它们的最高/最低x,y和z来创建外部边界。

这是第一步。理论上,根据这些信息,我们可以分辨出它们彼此之间的“侧”,这意味着我们可以从交叉点消除一些四边形(边)。但是,我不能假设我们有这些信息,因为立方体的旋转可能很难确定。

我的想法是取每对四边形,找到它们的平面的交点,然后确定该线是否与每对边的至少一个边相交。如果任何一对边具有与其任何边相交的交线,则四边形相交。如果没有相交,则两个立方体不相交。

然后我们可以确定第二个立方体上的交叉点的深度,其中平面相交线与其边缘相交。

然而,这只是推测性的。有没有更好,更有效的方法来确定这两个立方体的交集?我可以想到许多不同的方法来做到这一点,我也可以说它们在所需的计算量方面可能会有很大不同。

我目前正在使用Java,但C / C ++解决方案也很酷(我可以移植它们);甚至是伪造的,因为它可能是个大问题。

4 个答案:

答案 0 :(得分:1)

你应该看一下计算机图形学领域。他们有很多手段。例如。 Weiler–Atherton clipping algorithm。还有许多数据结构可以为您简化流程。提到AABB(Axis-aligned bounding boxes)。

答案 1 :(得分:0)

尝试使用分离轴定理。它应该在3d中应用,就像在2d中一样。

答案 2 :(得分:0)

如果从立方体的两侧创建多边形,则另一种方法是对它们使用构造空间几何(CSG)操作。通过构建每个多维数据集的二进制空间分区(BSP)树,您可以在它们上执行交集。交点的结果是一组表示交叉点的多边形。在您的情况下,如果多边形的数量为零,则立方体不会相交。

我想补充一点,这种方法可能不是一个很好的实时解决方案,但你没有说明是否需要在帧刷新时间内进行。

由于移植是一个选项,您可以查看CSG位于

的Javascript库

http://evanw.github.io/csg.js/docs/

我已将此库移植到C#,

https://github.com/johnmott59/CGSinCSharp

答案 3 :(得分:0)

要在三维中查找两个任意立方体的交点(接触),必须分两个阶段进行操作:

  1. 检测碰撞。这本身通常是两个阶段,但为简单起见,我们将其称为“冲突检测”。

该算法将是SAT(分离轴定理),或者是多面体展开/缩小的某种变体。再次,为简单起见,我们假设您将使用SAT。

我不会详细解释,因为其他人已经做了很多次,而且比我能做的更好。由此得出的结论是,冲突检测并非旨在告诉您哪里发生了冲突;只是它已经发生了。

  1. 检测到交叉点时,需要计算接触点。这是通过多边形裁剪算法完成的。在这种情况下,让我们使用https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm

有更简便的方法,但是SAT在3d中很容易掌握,SH裁剪也很容易引起您的注意,因此对于您来说是一个很好的起点。