常見的2D物理引擎冷溃,有Box2D因块、P2等菜循,一般都有基礎常用形狀:圓束析、矩形等,能夠滿足大部分游戲需求拦惋,而一些復雜的游戲需要更精細更普通的形狀匆浙,這就要用到多邊形,一般引擎都有支持架忌。
多邊形分為兩種:凸多邊形和凹多邊形。前者很常見我衬,引擎都支持叹放,但后者未必饰恕。其實本質上,應該沒有2D物理引擎直接支持凹多邊形的井仰,這和底層渲染有關埋嵌,此處不做深究。因此一個凹多邊形必須拆分出多個子凸多邊形俱恶,然后使用物理剛體雹嗦。
單獨就Box2D和P2為例,凸多邊形都可以直接構建很簡單合是,一個形狀就能夠完成了罪,不必贅述。著重講下凹多邊形的構建聪全。
1. Box2D
不支持凹多邊形泊藕,只能自己將形狀的一組頂點拆分∧牙瘢可以參考下面這個示例娃圆,將任意多邊形拆分為三角形,拿到處理后的頂點組再去構建凸多邊形蛾茉。
Github地址:
https://github.com/pury/SPTools/tree/master/Polygon2Triangle
2. P2
引擎底層支持構建凹多邊形讼呢,可以直接創(chuàng)建,推薦使用谦炬。最關鍵的是凹多邊形創(chuàng)建后悦屏,是多個形狀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))幕帆;
}