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

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

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

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

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

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

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

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

你应该看一下计算机图形学领域。 他们有很多手段。 例如Weiler-Atherton裁剪算法 。 还有许多数据结构可以为您简化流程。 提到AABB( 轴对齐的边界框 )。

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

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

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

由于移植是一个选项,您可以查看CSG所在的Javascript库

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

我已将此库移植到C#at

https://github.com/johnmott59/CGSinCSharp