「The Nature of Code」からBox2Dの基本について取り上げます。物理ライブラリを使うための基本知識をインプットします。Processingでプログラムを書いて、動作を確認します。動作を確認できるところがProcessingの楽しいところです。
座標
ProcessingでBox2Dを使いたいのですが、Processingの世界とBox2Dの世界では原点のとり方が異なります。
Processingでは左上が原点、Box2Dでは中央が原点です。2つの座標系で原点が異なるので、座標を変換する必要があります。Processingの座標系をピクセル、Box2Dの座標系をワールドと呼ぶとします。
ピクセルからワールドに座標を変換するには、以下のとおりです。
coordPixelsToWorld(x, y);
ワールドからピクセルに座標を変換するには、以下のとおりです。
coordWorldToPixels(worldPos);
Box2Dの中核的要素
World
Box2Dの世界を生成します。
box2d = new Box2DProcessing(this); box2d.createWorld();
Body
BodyDefでボディを定義して、Bodyでボディを生成します。ボディの定義では、座標やボディのタイプを設定します。
//ボディの定義 BodyDef bd = new BodyDef(); //Vec2 center = new Vec2(width/2, height/2); //ワールド座標に変換 Vec2 center = box2d.coordPixelsToWorld(width/2, height/2); //ボディの座標を設定する bd.position.set(center); //ボディのタイプ bd.type = BodyType.DYNAMIC; //ボディの作成 Body body = box2d.createBody(bd); body.setLinearVelocity(new Vec2(0, 3)); //速度 body.setAngularVelocity(1.2); //角速度
Shape
形状を定義します。
//形状の定義 PolygonShape ps = new PolygonShape(); //ワールド座標に変換 float box2Dw = box2d.scalarPixelsToWorld(150); float box2Dh = box2d.scalarPixelsToWorld(100); ps.setAsBox(box2Dw, box2Dh);
Fixture
フィクスチャを生成して、形状を割り当てます。ここで、物理パラメータを設定します。最後にボディにフィクスチャを割り当てます。
//フィクスチャの定義 FixtureDef fd = new FixtureDef(); //フィクスチャに形状を割り当てる fd.shape = ps; //物理パラメータの設定 fd.friction = 0.3; fd.restitution = 0/5; fd.density = 1.0; //ボディにフィクスチャを割り当てる body.createFixture(fd);
Joint
物体と物体を接続させるときに使います。詳しくは、他の記事で紹介します。
Vec2
Vec2はJBox2Dのクラスで、ベクトルを扱います。PVectorと記述が異なります。詳しくは、他の記事で紹介します。
//ワールド座標に変換 Vec2 mouseWorld = box2d.coordPixelsToWorld(mouseX, mouseY); println("ワールド座標" + mouseWorld); //ピクセル座標に変換 Vec2 pixelPos = box2d.coordWorldToPixels(mouseWorld); println("ピクセル座標" + pixelPos);
まとめ
「The Nature of Code」からBox2Dの基本について取り上げました。物理ライブラリを使うための基本知識をインプットしました。引き続き、「The Nature of Code」の内容を勉強します。
参考書籍
※Javaの勉強にもなるので一石二鳥です。