2D物理引擎游戏中任意形状的构建
2019-03-28
常见的2D物理引擎,有Box2D、P2等,一般都有基础常用形状:圆、矩形等,能够满足大部分游戏需求,而一些复杂的游戏需要更精细更普通的形状,这就要用到多边形,一般引擎都有支持。
多边形分为两种:凸多边形和凹多边形。前者很常见,引擎都支持,但后者未必。其实本质上,应该没有2D物理引擎支持凹多边形的,这和底层渲染有关,此处不做深究。因此一个凹多边形必须拆分出多个子凸多边形,然后使用物理刚体。
单独就Box2D和P2为例,凸多边形都可以直接构建很简单,一个形状就能够完成,不必赘述。着重讲下凹多边形的构建。
1. Box2D。
不支持凹多边形,只能自己将形状的一组顶点拆分。可以参考下面这个示例,将任意多边形拆分为三角形,拿到处理后的顶点组再去构建凸多边形。
https://github.com/pury/SPTools/tree/master/Polygon2Triangle
2. P2。
引擎底层支持构建凹多边形,可以直接创建,推荐使用。最关键的是凹多边形创建后,是多个形状shapes,设置碰撞掩码时,需要将所有形状遍历设置。刚体不需要设置坐标,引擎会自动计算出重心。
var path = [[-1, 1], [-1, 0], [1, 0], [1, 1], [0.5, 0.5]]; var body; body = new p2.Body({ mass:1}); body.type = p2.Body.STATIC; var result = body.fromPolygon(path, { removeCollinearPoints: 0.01 }); if (!result) return; world.add_body(body); for (var iii in body.shapes) { var shape = body.shapes[iii]; shape.collisionGroup = Math.pow(2, 6); shape.collisionMask = Math.pow(2, 6); shape.material = new p2.Material(Math.pow(2, 7)); }
By Pury.