【Box2D】如何做地形破坏(多边形破坏)及如何构建“凹”的多边形

前言:这里首先要感谢站点emanueleferonato提供了大量有价值的文章,感谢b2Separator作者 Antoan Angelov,Clipper的作者 Angus Johnson,感谢开源。 这里我所说的多边形破坏,指的是将一个现有的多边形挖去一部分,比如挖一个洞之类的。要做到这点,首先第一个问题是,如何去构建一个“凹”的多边形,因为Box2D本身是不支持凹多边形的。然后我们才能再去做“挖”这个动作。 经过两天的奋斗,终于是把这个事情给搞定了,放张效果图先(四边形被打出一个圆形的孔洞)。 polygon_break

先介绍下原理,构建一个凹的多边形是通过将凹多边形进行分解成一个个的凸多边形的组合来达到目的(从效果图中也可以看出来)。而破坏则是通过一个多边形对另一个多边形进行剪裁来实现。 首先计算出破坏后的多边形顶点信息,这里我是直接使用了Clipper类(可以很方便的计算出各种多边形相交的信息)。 有了顶点信息之后,接下来就只要构建出这个凹多边形就OK了。这里之前本是借用b2Separator,但是后来发现这段代码有bug(而且有很严重的内存泄露问题)。于是将算法看懂了之后,自己重新写了一个类,来实现这个效果。其实算法挺简单,大概就是以下步骤: 1、从一个凸点开始往下逐个检查,直到发现第一个“凹”点。 2、从“凹”的位置发射一条射线,并找到与之相交的线段,计算出交点。 3、从交点出发,逐个取顶点,直到找到刚才的“凹”点,至此一个凸多边形就被切出来了。 4、判断切出来的多边形的边数是否大于Box2D的多边形数限制,如果大于,则将其切分。 5、剔除切出去的多边形信息,然后根据新的顶点信息重复1,直到没有多边形可切出去为止(最后只剩2个顶点的时候即不可切出)