2016-01-21 24 views
1

举一个简单的例子,假设有2个边界框(不一定是轴对齐),每个边界框由6个平面定义。如何测试2组平面(每个平面在3D空间中定义一个体积)重叠?

有没有一种很好的方法来确定每组平面定义的体积是否重叠? (只有true/false,不需要相交卷)。

该问题的解决方案,如果它的一般应该能够扩展到多组飞机。


到目前为止,我想出了基本解决方案依赖于各组平面转换成几何 - (顶点&多边形),然后进行交叉点,你会如果您有任何相交定期2网格。然而,我想知道是否有一个更优雅的方法不依赖于此。

回答

0

您可以通过相互交叉其平面形成的所有可能的三元组来确定其中一个物体的顶点,然后检查每个产生的顶点是否位于定义第二个物体的平面的正面。当第二个物体的每个平面都作为基本顶点p和正常v时,这涉及检查(x-p).v> = 0。

假设您的平面分别作为基本顶点(p,q,r)和法线(u,v,w)给出,其中法线形成矩阵M的列,交集为x = inv M)。(pu,qv,rw)。

根据两个物体的规则(例如平行六面体),很多点积和矩阵求逆可以预先计算和重用。也许你可以分享一些你的先决条件。

+0

这很接近,但不会在有相交边缘的情况下工作(每边的顶点不一定与其他体积相交)。可以在边上执行与顶点类似的操作(从相同的2个平面收集顶点对 - 逻辑边),并将所有这些与其他卷平面相交。然而,在这一点上 - 它与计算两个体积的整个几何体几乎相同。另一种方法是保持裁剪一个卷 - 通过另一个 - 检查是否所有垂直裁剪从该卷。 – ideasman42

0

发布这个答案,因为这是一个可能的解决方案(仅仅从思考问题)。

  • 首先计算每个平面集上的一个点(使用3个平面),并检查这些点中的任何一个是否在另一个平面集内。
    这包括一个卷完全在另一个卷内的情况,但当然不适用于部分重叠的卷。

下面的方法可以检查部分交叉点。

  • 为其中一组,计算ray defined by each plane-plane pair
  • 通过集合中的其他平面剪切每个这些光线,(存储每个光线的最小值和最大值)
  • 丢弃最大值大于其最大值的任何光线。
    生成的光线代表卷的所有'边缘'。

到目前为止,所有这些计算都是在一组平面上完成的,因此这些信息可以计算一次并存储以供重复使用。

现在继续剪切光线,但这次使用另一组平面,(同样,丢弃光线的分数大于最大值)。

如果剩余一条或多条光线​​,则存在交叉点。


注0):这不会是有效的为任意数量的飞机,(太多关于^ 2个检查回事)。在这种情况下,转换为多边形,然后使用更典型的几何树结构更有意义。

注1):随着平面对的迭代,可以完成丢弃射线,以避免首先存储所有可能的边缘,仅丢弃许多边缘。

注2):之前剪裁所有光线与所述第二组平面,快速检查可以通过执行平面集之间的点 - 内部测试进行(该点可以用射线被计算并其最小/最大)。如果一个形状位于另一个形状的内部,这将起作用,但是裁剪射线仍然需要最终结果。

1

交集体积(如果有的话)是所有平面右侧(从两个体积合并)的所有点的集合。因此,如果您可以选择3个交叉点位于所有剩余平面右侧的平面,那么这两个交点就有交点。

这是一个linear programming问题。在你的情况下,你只需要找到是否有feasible solution;有这样做standard techniques