常见的2D物理引擎,有Box2D、P2等,一般都有基础常用形状:圆、矩形等,能够满足大部分游戏需求,而一些复杂的游戏需要更精细更普通的形状,这就要用到多边形,一般引擎都有支持。
多边形分为两种:凸多边形和凹多边形。前者很常见,引擎都支持,但后者未必。其实本质上,应该没有2D物理引擎直接支持凹多边形的,这和底层渲染有关,此处不做深究。因此一个凹多边形必须拆分出多个子凸多边形,然后使用物理刚体。
单独就Box2D和P2为例,凸多边形都可以直接构建很简单,一个形状就能够完成,不必赘述。着重讲下凹多边形的构建。
1. Box2D
不支持凹多边形,只能自己将形状的一组顶点拆分。可以参考下面这个示例,将任意多边形拆分为三角形,拿到处理后的顶点组再去构建凸多边形。
Github地址:
https://github.com/pury/SPTools/tree/master/Polygon2Triangle
2. P2
引擎底层支持构建凹多边形,可以直接创建,推荐使用。最关键的是凹多边形创建后,是多个形状shapes,设置碰撞掩码时,需要将所有形状遍历设置。刚体不需要设置坐标,引擎会自动计算出重心。
官方在线实例:
http://schteppe.github.io/p2.js/demos/concave.html
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));
}
网友评论