4

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

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

这是第一步。从理论上讲,根据这些信息,我们可以分辨出它们彼此位于哪个“边”上,这意味着我们可以从相交处消除一些四边形(边)。但是,我不能假设我们有这些信息,因为立方体的旋转可能会使简单地确定变得困难。

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

然后,我们可以通过平面相交线与其边缘相交的位置来确定第二个立方体上相交的深度。

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

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

4

4 回答 4

3

要在三个维度上找到两个任意立方体的交点(接触)点,您必须分两个阶段进行:

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

该算法将是 SAT(分离轴定理),或者是多面体扩展/缩减的一些变体。同样,为简单起见,我们假设您将使用 SAT。

我不会详细解释,因为其他人已经做过很多次了,而且比我做得更好。从中“带回家”的是,碰撞检测并非旨在告诉您发生碰撞的位置;只是它已经发生了。

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

有更简单、更好的方法可以做到这一点,但 SAT 在 3d 中很容易掌握,SH 剪辑也很容易让你了解,所以对你来说是一个很好的起点。

于 2019-01-29T10:41:02.097 回答
1

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

于 2013-07-09T21:20:28.940 回答
0

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

于 2013-07-09T21:11:39.567 回答
0

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

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

由于移植是一个选项,您可以查看执行 CSG 的 Javascript 库,位于

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

我已将此库移植到 C#

https://github.com/johnmott59/CGSinCSharp

于 2016-09-13T22:39:32.903 回答