Box2dの複合形狀

由於Box2D是最多隻能創建八邊形形狀的剛體(雖然可以修改源碼增添邊數),尤其是隻能創建凸多邊形,要是想創建凹多邊形,最好就是將其拆分爲多個凹多邊形,轉爲創建複合形狀的剛體。

從實現上來看,只是多了幾個ShapeDef,然後body在調用了多個CreateShape方法

注:
b2PolygonDef:SetAsOrientedBox方法的參數:半寬,半高,位置,角度(子形狀)
b2CircleDef:localPosition屬性:位置(子形狀)
b2PolygonDef的多邊形比較消耗資源
一般儘可能用Circle跟Box配合旋轉創建複雜圖形
個人感覺最強大的還是三角形,想想神奇的3D引擎就知道了
Box2dの複合形狀[Ispooky]

源碼:
三角形 AND 三角形:
bodyDef = new b2BodyDef();
bodyDef.position.Set(275 / RATIO, ( i * -120 - 600) / RATIO);
bodyDef.angle = (Math.random() * 360) * Math.PI / 180;
                               
boxDef1 = new b2PolygonDef();
boxDef1.vertexCount = 3;
boxDef1.vertices[0] = new b2Vec2(0, 0);
boxDef1.vertices[1] = new b2Vec2( -30 / RATIO, 30 / RATIO);
boxDef1.vertices[2] = new b2Vec2(0, -30 / RATIO);
boxDef1.density = 2.0;
                               
boxDef2 = new b2PolygonDef();
boxDef2.vertexCount = 3;
boxDef2.vertices[0] = new b2Vec2(0, 0);
boxDef2.vertices[1] = new b2Vec2(0, -30 / RATIO);
boxDef2.vertices[2] = new b2Vec2(30 / RATIO, 30 / RATIO);
boxDef2.density = 2.0;
                               
body = world.CreateBody(bodyDef);
body.CreateShape(boxDef1);
body.CreateShape(boxDef2);
body.SetMassFromShapes();


圓形 AND 矩形
bodyDef = new b2BodyDef();
bodyDef.position.Set(100 / RATIO, ( i * -120 - 100) / RATIO);
bodyDef.angle = (Math.random() * 360) * Math.PI / 180;
                               
boxDef1 = new b2PolygonDef();
boxDef1.SetAsBox(60 / 2 / RATIO, 60 / 2 / RATIO);
boxDef1.density = 2.0;
                               
circleDef = new b2CircleDef();
circleDef.radius = 30 / RATIO;
circleDef.density = 2.0;
circleDef.localPosition = new b2Vec2(0, -30 / RATIO);
                               
body = world.CreateBody(bodyDef);
body.CreateShape(boxDef1);
body.CreateShape(circleDef);
body.SetMassFromShapes();

矩形 AND 矩形 AND ...
bodyDef = new b2BodyDef();
bodyDef.position.Set(400 / RATIO, (i * -120 - 100) / RATIO);
bodyDef.angle = (Math.random() * 360) * Math.PI / 180;
               
boxDef1 = new b2PolygonDef();
boxDef1.SetAsBox(80 / 2 / RATIO, 20 / 2 / RATIO);
boxDef1.density = 2.0;
               
boxDef2 = new b2PolygonDef();
boxDef2.SetAsOrientedBox(20 / 2 / RATIO, 60 / 2 / RATIO, new b2Vec2( -30 / RATIO, -40 / RATIO), 0);
boxDef2.density = 2.0;
               
boxDef3 = new b2PolygonDef();
boxDef3.SetAsOrientedBox(20 / 2 / RATIO, 60 / 2 / RATIO, new b2Vec2(30 / RATIO, -40 / RATIO), 0);
boxDef3.density = 2.0;
               
boxDef4 = new b2PolygonDef();
boxDef4.SetAsOrientedBox(10 / 2 / RATIO, 20 / 2 / RATIO, new b2Vec2( -15 / RATIO, -60 / RATIO), 0);
boxDef4.density = 2.0;
               
boxDef5 = new b2PolygonDef();
boxDef5.SetAsOrientedBox(10 / 2 / RATIO, 20 / 2 / RATIO, new b2Vec2(15 / RATIO, -60 / RATIO), 0);
boxDef5.density = 2.0;
               
body = world.CreateBody(bodyDef);
body.CreateShape(boxDef1);
body.CreateShape(boxDef2);
body.CreateShape(boxDef3);
body.CreateShape(boxDef4);
body.CreateShape(boxDef5);
body.SetMassFromShapes();


運行結果截圖:
Box2dの複合形狀[Ispooky]

運行結果:

發佈了6 篇原創文章 · 獲贊 2 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章