将盒子分成注入固体周围的凸实体(即“雕刻”)

时间:2014-03-02 23:50:11

标签: algorithm 3d geometry aabb convex

我在其中给出了一个直角矩形棱镜(即一个盒子)和一个任意的实体,这样盒子就可以匹配上述实体的AABB(轴对齐的边界框)。 / p>

我想从盒子中“切出”固体,然后将盒子分成固体面周围的几个凸面部分(希望如果实体有 n 面,然后 n 段。基本上,在盒子里做一个实心形状的孔。这是我的意思的图片:

enter image description here

但是,这也必须适用于这样的形状:

enter image description here

我认为,对于像右棱镜和金字塔这样的轴对称形状比使用球体等中心对称形状更容易解决问题(正如您所看到的,球体不是合适的球体;它们具有有限数量的平坦边缘)。我正在寻找一种适用于任何实体的通用算法,无论它有多复杂或旋转或倾斜。

2 个答案:

答案 0 :(得分:1)

如果封闭的形状仅限于平面,则在编辑时可以解决您的问题。特别是,从封闭形状的质心向外穿过封闭形状的每个顶点的工程线,直到封闭的边界框。现在沿着这些线中的两条线之间的每个面切割封闭材料 - 即,沿着封闭形状的每个边缘的向外投影。这些切口中的每一个都是平坦的,因为它是由质心和两个顶点限定的平面的一部分。切割周围材料的每个所得片都是凸起的。

在具有任意内部形状的问题的原始措辞中,如果您希望段的数量是有限的,那么在一般情况下您运气不好。特别是,如果封闭的形状是一个球体,球体表面的任何有限部分,虽然相对于球体凸出,必然相对于球体外部的任何其他部分是凹的,它是其中的一部分;因此,这样的外部部分不会凸出,并且不符合您的要求。

答案 1 :(得分:1)

为不存在于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的所有卷 - 这些可以通过查找共享面来组合成格式塔卷。