两个一般六面体之间的碰撞检测

我有2个六面体。 唯一的保证是它们每个都有8个vertex3f(带有x,y和z分量的顶点)。 鉴于此,如何判断这些是否发生碰撞?

我似乎太愚蠢了。

考虑一下。 如果实体1的任何边缘与实体2的任何面相交,则会发生碰撞。 这不是很全面,因为有一种情况完全包含在另一种中,你可以通过确定其中一种是否包含在另一种中来测试。


检查边缘面交叉是这样的。

  1. 将边缘定义为从一个顶点运行到另一个顶点的向量。 记下边缘的长度L
  2. 通过顶点,法线,平面内基础以及该基础中剩余顶点的位置来定义平面线段。
  3. 找到直线和平面的交点 。 在通常的公式中,您将能够获得沿着线的长度,以及您所选择的基础中的交叉点的平面内坐标。
  4. 交点必须以长度[0,L] ,并且必须位于平面中的图形内。 最后一部分有点难,但有一个众所周知的通用解决方案 。

这会奏效。 为了口才,我更喜欢R ..的解决方案 。 如果你需要速度……好吧,你只需要尝试它们就能看到。

在我试图回答它并让我丢失post之后删除你的上一个问题后,我犹豫不决。 请不要再这样做了。 无论如何:

基于建设性的实体几何 ,不一定是最优的,但显然是正确的:

  1. 将两个实体表示为6个半空间的交集。 请注意,这取决于凸性而不是其他任何东西,并且延伸到具有更多边的实体。 半空间的首选表示是在每个表面上选择一个点(例如,顶点)和向该表面选择向外指向的单位法向量。
  2. 通过将所有12个半空间视为新固体的定义半空间来交叉两个实体。 (此步骤纯粹是概念性的,可能不涉及任何实际代码。)
  3. 计算新实体的曲面/边缘表示并检查它是否为非空。 这样做的一种方法是首先用12个半空间中的每一个填充表面/边缘表示,其中边缘在2个实体的边界之外,然后将其边缘与剩余的11个半空间中的每一个相交。

这听起来像是一些工作,但没有什么复杂的。 只有点积,交叉积(获得初始表示)和投影。

假设你的一个六面体H1有顶点(x_1, y_1, z_1), (x_2, y_2, z_2), ... 找到每个坐标的最大值和最小值: x_min = min(x_1, x_2, ...)x_max = max(x_1, x_2,...) ,依此类推。 对其他六面体H2做同样的事情。

如果间隔[x_min(H1), x_max(H1)]和间隔[x_min(H2), x_max(H2)]不相交(即, x_max(H1) < x_min(H2)x_max(H2) < x_min(H1) ),然后六面体不可能发生碰撞。 对yz坐标重复此操作。 定性地说,这就像在x轴上观察每个六面体的阴影一样。 如果它们不重叠,则多面体不会发生碰撞。

如果任何间隔重叠,则必须继续进行更精确的碰撞检测。 这将更加棘手。 明显的蛮力方法是检查一个边缘的任何边缘是否与另一个边缘相交,但我想你可以做得更好。

用于检查边缘是否与面相交的powershell方式...首先,您将找到边缘定义的线与面定义的平面的交点(例如,参见维基百科 )。 然后你必须检查那个点是否实际上在边缘和面部。 边缘很简单 - 只需看看坐标是否位于定义边缘的两个顶点的坐标之间。 面部比较棘手,特别是不能保证凸起。 在一般情况下,您只需要看到它所在的每个边缘定义的半平面的哪一侧。 如果它在所有人的内半平面上,它就在脸部内部。 遗憾的是,我现在没有时间打字,但我打赌谷歌搜索可以帮助你。 但当然,这都是蛮力,可能有更好的方法。 (而且dmckee指出了一个特殊情况,这是不能处理的)