6

我正在编写代码,它将为二维的(不一定是凸的)多边形构建一个定向边界框(obb)树。

到目前为止,我能够通过找到它的凸包并在外壳上使用旋转卡尺来找到多边形的面积最小 obb。

下图就是一个例子。带有红线和红点的黄色填充多边形描绘了原始多边形。凸包用黑色线条显示为蓝色,而 obb 显示为紫色线条。

(编辑)根据要求:交互式版本- 仅在 chrome 中测试

现在我想扩展我的代码来构建一个 OBB 树,而不仅仅是一个 OBB。这意味着我必须切割多边形,并为多边形的每一半计算新的 OBB。

推荐的方法似乎是通过将 OBB 切成两半来切割多边形。但是,如果我将 obb 从其任一轴的中间切开,看起来我将不得不在多边形上创建新顶点(否则我如何找到该分区的凸包?)。

  1. 有没有办法避免添加这样的顶点?
  2. 如果没有,最简单的方法是什么(相对于实施难度)?什么是运行时效率最高的方式?
4

2 回答 2

4

这是我们要为其创建 OBB 树的凹多边形示例:

为了将它分割成一组新的凹多边形,我们可以简单地通过从中间切割边界框并适当地添加新的“交点”顶点来切割我们当前的多边形:

这可以在 O(vertices) 时间内完成,因为我们可以简单地遍历所有边,如果边与红色分割线相交,则添加一个相交顶点。

然后可以根据这些相交顶点划分多边形,以获得一组新的更小(但仍可能是凹面的)多边形。将至少有两个这样的多边形(红线的每边一个),但可能还有更多。在下一张图片中,新的多边形已被着色以强调:

递归地计算这些较小多边形的定向边界框可以得到所需的结果。例如,以下是递归深度为 2 的框:

在此处输入图像描述

希望这足以帮助那些与我一样挣扎的人!

于 2012-05-29T05:08:03.530 回答
3

如果没有进一步的上下文,我不确定这是你需要的,但这里有......

将一个凹多边形细分为一组凸多边形

在我上面的评论中,我建议递归地细分凹多边形以获得一组凸多边形。一种(常见)方法如下:

  1. 如果多边形是凸的,停止。(我想将多边形添加到数组中)
  2. 选择多边形的未标记边。标记边缘。
  3. 沿边缘分割多边形(实际上是与边缘重合的无限线)。
  4. 对两个结果多边形(如果非空)递归重复此算法。

注意:这正是 BSP 树的构建方式。除了在上面的算法中,我们没有构建树节点并在其中存储多边形。也许仅 BSP 的解决方案也可以解决您的问题(而不是使用 OBB)。

测试多边形的凸度(步骤 1)

对于每条边,将每个顶点分类为边上、前边或边后。所有顶点都应该在边上或边上。如果不是(边缘后面至少有 1 个顶点),则多边形是凹的。有关“分类”部分的详细信息,请参阅我对另一个问题的回答,它也这样做了。

其余的部分

获得凸子多边形列表后,您可以像在原始帖子中所做的那样为它们生成 OBB。你不会有一个OBB虽然......

通过细分,您正在添加顶点(您的问题中的一个问题)。但是,根据您的应用程序,您可能不需要使用细分的多边形:如果您要使用 BSP 树并且只需要简单的碰撞,您只需遍历树并进行一些点/边分类而不处理任何多边形顶点。

无论如何,由于我不知道您希望您的应用程序做什么,因此不确定要进一步推荐什么,但希望这会有所帮助。

编辑:我刚刚意识到,也许这就是你想要做的:构建一个 BSP 树并为每个节点生成 OBB,从根节点到叶节点。因此根节点 OBB 将包含整个凹多边形,而叶节点仅包含凸子多边形。我记得最初的 Doom 引擎做了类似的事情(除了轴对齐的 BB)。

于 2012-05-28T23:30:37.990 回答