1

我得到了一个直角棱镜(即一个盒子)和一个任意的凸面实体,使得该盒子与上述实体的 AABB(轴对齐边界框)相匹配。

我想从盒子中“雕刻出”实体,并在这样做时将盒子分成几个围绕实体面的凸段(希望,如果实体有n 个面,则有n 个段)。基本上,在盒子上打一个实心形状的孔。这是我的意思的图片:

在此处输入图像描述

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

在此处输入图像描述

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

4

2 回答 2

1

正如编辑的那样,如果封闭的形状仅限于具有平面,则可以解决您的问题。特别地,从封闭形状的质心向外通过封闭形状的每个顶点将线投影到封闭边界框。现在沿着其中两条线之间的每个面切割封闭材料 - 即沿着封闭形状的每个边缘的向外投影。这些切割中的每一个都是平坦的,因为它是由质心和两个顶点定义的平面的一部分。周围材料被切割成的每个最终碎片都将是凸面的。

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

于 2014-03-03T04:52:06.793 回答
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 体积 - 这些可以通过查找共享面组合成格式塔体积。

于 2014-03-04T10:11:20.863 回答