Algorithm 将长方体拆分为围绕内接实体的凸面实体(即“雕刻出”)

Algorithm 将长方体拆分为围绕内接实体的凸面实体(即“雕刻出”),algorithm,3d,geometry,aabb,convex,Algorithm,3d,Geometry,Aabb,Convex,我得到了一个右矩形棱柱体(即长方体)和其中的任意凸体,这样长方体与上述实体的AABB(轴对齐边界盒)匹配 我想从长方体中“雕刻”出实体,并在这样做时,将长方体分割为围绕实体面的几个凸段(如果实体有n个面,那么最好是n个段)。基本上,在盒子上打一个实心形状的孔。以下是我的意思: 但是,这也必须适用于以下形状: 问题是,我认为,使用轴对称形状(如右棱柱和金字塔)比使用中心对称形状(如球体)容易得多(如您所见,球体不是真正的球体;它们有有限数量的平面)。我正在寻找一种适用于任何实体的通用算法,无论

我得到了一个右矩形棱柱体(即长方体)和其中的任意凸体,这样长方体与上述实体的AABB(轴对齐边界盒)匹配

我想从长方体中“雕刻”出实体,并在这样做时,将长方体分割为围绕实体面的几个凸段(如果实体有n个面,那么最好是n个段)。基本上,在盒子上打一个实心形状的孔。以下是我的意思:

但是,这也必须适用于以下形状:


问题是,我认为,使用轴对称形状(如右棱柱和金字塔)比使用中心对称形状(如球体)容易得多(如您所见,球体不是真正的球体;它们有有限数量的平面)。我正在寻找一种适用于任何实体的通用算法,无论它多么复杂、旋转或倾斜。

编辑后,如果封闭形状仅限于平面,则您的问题有一个解决方案。特别是,将线从封闭形状的质心向外投影,穿过封闭形状的每个顶点,投影到封闭边界框。现在沿其中两条线之间的每个面切割封闭材质-即沿封闭形状的每个边的向外投影。每个切割都是平面的,因为它是由质心和两个顶点定义的平面的一部分。将周围材料切割成的每个合成块都是凸面的


在问题的原始措辞中,任意内部形状,如果你想要分段的数量是有限的,在一般情况下,你是运气不好的。特别是,如果封闭形状是一个球体,那么球体表面的任何有限部分,尽管相对于球体是凸的,但相对于球体以外的任何其他部分,它是其一部分,必然是凹的;这样的外部段就不会是凸的,也不会满足您的要求。

为不位于AABB边界上的凸实体建立一个面列表,我们称之为
F
,以及一个金字塔列表,初始为空,称为
p
。然后:

while F is not empty {
  for each vertex v of the AABB {
    for each face f in F {
      If v has line-of-sight to f (cross product test with face normal) {
        Build a pyramid p with base f and apex v
        Add p to P
        Remove f from F
        Add the other faces of p to F unless they lie on the AABB boundary
      }
    }
  }
}

完成后,您将有一个金字塔列表,其中包括实体中不存在的所有AABB体积-这些可以通过找到共享面组合成格式塔体积。

所有可能的形状确实都有有限数量的平面。我会用更多的图片更新描述。我已经把我的第二段移到了我答案的顶部,这段内容适用于编辑过的问题。