我正在编写代码,为2维的(不一定是凸面的)多边形构建一个定向边界框(obb)树。
到目前为止,我能够通过找到它的凸包并在船体上使用旋转卡尺来找到多边形的面积最小的obb。
下面的图片就是一个例子。带有红线和红点的黄色填充多边形描绘了原始多边形。凸壳显示为蓝色,黑色线条,obb显示为紫色线条。
现在我想扩展我的代码来构建一个OBB树,而不仅仅是一个OBB。这意味着我必须剪切多边形,并为多边形的每一半计算新的OBB。
建议的方法是将OBB切成两半来切割多边形。但是,如果我通过其中任一轴的中间切割obb,看起来我必须在多边形上创建新的顶点(否则如何找到该分区的凸包?)。
答案 0 :(得分:4)
以下是我们要为其创建OBB树的凹多边形的示例:
为了将其拆分为一组新的凹面多边形,我们可以通过在中间切割边界框并根据需要添加新的“交叉点”顶点来简单地剪切当前多边形:
:
这可以在O(顶点)时间内完成,因为我们可以简单地遍历所有边,并且如果边穿过红色分裂线,则添加交叉点顶点。
然后可以根据这些交点顶点划分多边形,以获得一组新的较小(但仍可能是凹面)多边形。将至少有两个这样的多边形(红线每边一个),但可能还有更多。在下一张图片中,新的多边形已被着色以强调:
递归计算这些较小多边形的定向边界框可得到所需的结果。例如,以下是递归深度2的框:
希望这很清楚,足以帮助那些与我一样挣扎的人!
答案 1 :(得分:3)
我不确定这是你需要什么而没有进一步的背景,但是这里......
在上面的评论中,我建议递归细分凹多边形,以便获得一组凸多边形。一种(常见的)方法如下:
注意: 这正是BSP树的构建方式。除了上面的算法,我们不构建树节点并在其中存储多边形。也许只有BSP的解决方案也可以解决您的问题(而不是使用OBB)。
对于每条边,将每个顶点分类为在边缘的前面或后面。所有顶点都应位于边缘之前或之前。如果不是(边缘后面至少有一个顶点),则多边形是凹的。有关“分类”部分的详细信息,请参阅my answer to a different question,也可以执行此操作。
获得凸子多边形列表后,您可以像在原始帖子中那样为它们生成OBB。你不会有OBB 树虽然......
通过细分,你 添加顶点(问题中的一个问题)。根据您的应用程序,您可能不需要使用细分的多边形:如果您要使用BSP树并且只需要简单的碰撞,您只需遍历树并执行一些点/边分类而不处理任何多边形顶点。
无论如何,由于我不知道你希望你的应用程序做什么,所以不确定要进一步推荐什么,但希望这会有所帮助。
编辑:我刚刚意识到这可能就是你要做的事情:构建一个BSP树并为每个节点生成OBB,从根节点到叶子节点。因此根节点OBB将包含整个凹多边形,而叶节点仅包含凸子多边形。我记得原来的Doom引擎做了类似的事情(除了轴对齐的BB)。