一尘不染

两个普通六面体之间的碰撞检测

algorithm

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


阅读 226

收藏
2020-07-28

共1个答案

一尘不染

看来我太傻了,不能辞职。

考虑一下。如果实体1的任意边与实体2的任意面相交,则发生碰撞。这还不是很全面,因为在某些情况下其中一个完全包含在另一个中,您可以通过确定其中一个的中心是否包含在另一个中来进行测试。


检查边缘面相交的工作原理是这样的。

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

这将起作用。对于口才,我宁愿选择R..的解决方案。如果您需要速度…那么,您只需尝试一下即可看看。

当您删除最后一个问题时,我很犹豫,我正试图回答它,使我迷失了自己的职位。请不要再这样做。无论如何:

基于构造实体几何,不一定是最佳的,但显然是正确的:

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

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

2020-07-28