物理演算-Box2d その2
では昨日の続きです。
前回はボールが落ちてゆくだけでしたが、今回は床を生成してボールをはねさせてみましょう。
前回のボール生成の箇所の下に、以下のように追加して下さい(上でもいいですけど)。
// 床の生成 var groundBodyDef = new b2BodyDef(); groundBodyDef.type = b2Body.b2_staticBody; groundBodyDef.position.Set(WORLD_HARF / WORLD_SCALE , (WORLD_SIZE - 10) / WORLD_SCALE); var groundBody = world.CreateBody(groundBodyDef); var groundBox = new b2PolygonShape(); groundBox.SetAsBox(WORLD_SIZE / 2 / WORLD_SCALE, 10 / 2 / WORLD_SCALE); var groundFixtureDef = new b2FixtureDef(); groundFixtureDef.shape = groundBox; groundFixtureDef.density = 1; groundFixtureDef.friction = 1; groundBody.CreateFixture(groundFixtureDef);
ボール生成の時とほとんど変わりありません。
違うのはShapeの部分ですね。
ボールの時は
var circlePly = new b2CircleShape(16 / WORLD_SCALE);
でしたが、今回床のような四角形は
var groundBox = new b2PolygonShape(); groundBox.SetAsBox(WORLD_SIZE / 2 / WORLD_SCALE, 10 / 2 / WORLD_SCALE);
となっています。
まずShapeを形作る関数そのものが違いますね。
円形の場合は半径を引数としてb2CircleShapeを呼び出せばよかったのですが、四角形はb2PolygonShapeを引数なしで呼び出し、続くSetAsBoxで縦横のサイズを引数として実行しています。
まずb2PolygonShapeですが、これは多角形を生成するための関数と思われます。そしてSetAsBoxで四角形を定義しています。たぶん、他の関数を呼び出せば三角形や五角形、もっと複雑な形をも定義できるかと思いますが、あいにくまだ調査できていません。
ところでSetAsBoxの引数ですが、引数の縦横のサイズ、WORLD_SCALEだけでなく2でも割っています。マニュアルを見たらしっかりと「縦横半分のサイズ」と書いてありました。感覚的にちょっと不思議。
これで画面下方に床が生成されました。
上から落ちてきたボールがずぅーっと跳ね続けているのが見ることができると思います。
以下、jsdo.itにアップしたものです。
物理演算-Box2d その2
そうそう、以下のところも修正しました。
circleFix.restitution = 1;
ボールの反発係数、当初は5でしたが、跳ねすぎるので1に変更しました。
次は時間が経つに連れて反発力が失われてゆくのを再現してみましょう。
ほんの少しの修正で済みました。
反発係数ですが、0〜1の範囲で設定するのが基本のようです。
というわけで0.9に設定してみました。
物理演算-Box2d その2・改