将基于2D平铺的形状转换为简化多边形

时间:2012-10-07 03:54:24

标签: c# xna polygon tile

Tile based world converted to polygon shapes

如上图所示,我有一个2D阵列的瓷砖,每个瓷砖在我的游戏世界中有4个点。我正在寻找一种方法,将从单个瓷砖构造的这些形状转换为简化的(没有不必要的顶点,只有形成轮廓所需的那些)多边形。

我一直在四处寻找,在这里和其他地方都没有运气。但也许我不知道要搜索的正确术语。任何帮助表示赞赏。

额外信息:我希望用它来优化动态照明。如果有人采用不同的方法在基于图块的世界中完成快速动态阴影,那么这也将回答这个问题。

2 个答案:

答案 0 :(得分:2)

我建议下一个算法:

  1. 将所有边缘位置存储到2D阵列中(边缘位置是边缘的中心)。
  2. 计算此数组中的重复边(1表示没有重复,2表示与另一条边相交。其他值是不可能的。)
  3. 从具有重复计数1(没有重复)的数组中拾取第一个未标记的边缘,并在测试方向上应用简单的递归填充算法(例如,顺时针方向),直到第一个边缘到达。所有这些边将形成一个简化的多边形。如果尚未建立未标记的边缘,那么GOTO 5。
  4. 标记所使用的步骤3中的所有边缘。 GOTO到第3步。
  5. 结束。
  6. 为了更直观地表示算法,我在下面发布了一张图片。

    enter image description here

答案 1 :(得分:1)

天真的方法是简单地逐步浏览每一个图块并将任何过渡边标记为多边形,但是您可以重复使用常见的edge detection例程来获得更好的性能。

之后你可能有兴趣对这些多边形进行细分,以便将它们转换为三角形集合(使后面的阴影/光照/交叉点数学变得更加简单),在这种情况下唯一的问题是如果你最终凹面多边形,但一个体面的镶嵌器应该允许你将它分解成凸多边形。我不认为XNA有任何内置的镶嵌细分,因此您可能需要找到一个实用程序库来为您完成。