Math 如何测试两组平面(每个平面定义三维空间中的体积)的重叠?

Math 如何测试两组平面(每个平面定义三维空间中的体积)的重叠?,math,3d,computational-geometry,plane,Math,3d,Computational Geometry,Plane,举个简单的例子,假设有2个边界框(不一定是轴对齐的),每个边界框由6个平面定义 有没有一种好方法可以确定每组平面定义的体积是否重叠? (仅为真/假,不需要相交体积) 这个问题的一个解决方案,如果它的通用性应该能够扩展到多组平面 到目前为止,我提出的解决方案基本上依赖于将每组平面转换为几何体-(顶点和多边形),然后执行相交,就像必须与任意两个规则网格相交一样。然而,我想知道是否有一种更优雅的方法不依赖于此。您可以通过将其平面形成的所有可能的三元组相互相交来确定其中一个实体的顶点,然后检查生成的每

举个简单的例子,假设有2个边界框(不一定是轴对齐的),每个边界框由6个平面定义

有没有一种好方法可以确定每组平面定义的体积是否重叠? (仅为真/假,不需要相交体积)

这个问题的一个解决方案,如果它的通用性应该能够扩展到多组平面



到目前为止,我提出的解决方案基本上依赖于将每组平面转换为几何体-(顶点和多边形),然后执行相交,就像必须与任意两个规则网格相交一样。然而,我想知道是否有一种更优雅的方法不依赖于此。

您可以通过将其平面形成的所有可能的三元组相互相交来确定其中一个实体的顶点,然后检查生成的每个顶点是否位于定义第二个实体的平面的好边上。当第二个实体的每个平面都给定为基准顶点p和法线v时,这涉及检查(x-p).v>=0

假设平面分别作为基准顶点(p,q,r)和法线(u,v,w)给定,其中法线形成矩阵M的列,交点为x=inv(M)。(p.u,q.v,r.w)


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

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

  • 首先计算每个平面集上的一个点(使用3个平面),然后简单地检查这些点是否位于另一个平面集内。
    这包括一个体积完全位于另一个体积内的情况,但对于部分重叠的体积当然不起作用

以下方法可以检查部分交点

  • 对于其中一个集合,计算
  • 通过集中的其他平面剪裁这些光线中的每一条(存储每条光线的最小值和最大值)
  • 丢弃最小值大于最大值的任何光线。
    生成的光线表示体积的所有“边”
到目前为止,所有这些计算都是在一组平面上完成的,因此这些信息可以计算一次并存储起来以供重复使用

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

如果还有一条或多条光线,则存在交点


注意0):这对于任何数量的飞机都是无效的(正在进行的^2次检查太多)。在这种情况下,转换为多边形,然后使用更典型的几何体树结构更有意义

注意1):可以在对平面对进行迭代时丢弃光线,以避免首先必须存储所有可能的边,而只丢弃许多边

注意2):在使用第二组平面剪裁所有光线之前,可以通过在平面组之间进行点内测试进行快速检查(可以使用光线及其最小/最大值计算该点)。如果一个形状在另一个形状内,这将起作用,但是最终结果仍然需要剪裁光线。

相交体积(如果有)是所有平面右侧的所有点的集合(两个体积的组合)。因此,如果可以选择其交点位于所有剩余平面右侧的3个平面,则两个体积具有交点


这是一个问题。在您的情况下,您只需要找到是否存在错误;有很多方法可以做到这一点。

这很接近,但在存在相交边的情况下(每一端的顶点不一定与另一个体积相交)不起作用。可以在边上执行与顶点类似的操作(从相同的2个平面-逻辑边收集顶点对),并将所有这些顶点与其他体积平面相交)。但此时,它几乎与计算两个体积的整个几何体相同。另一种方法是继续剪裁一个卷,逐个剪裁另一个卷,检查是否从该卷剪裁了所有顶点。