元Webデザイナー兼コーダーの備忘録

ウェブデザインやプログラミング、ブログのカスタマイズなどについてアウトプットしています。

 メニュー

» HTML入門のまとめはこちらです。

Processing:Box2Dの基本

「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の勉強にもなるので一石二鳥です。

» HTML入門のまとめはこちらです。