JavaScriptで物理シミュレーション

Box2DFlashAS3というAS3用の物理シミュレータがあるわけですが、

「同じECMAScriptだし、ASを少し置換すればJSでも動くんじゃね?」

と言う単なる思い付きを実行してみたら、あっさり動きました
まさかホントに動くなんて、正直自分でもびびった。


まぁ、あっさりとは言っても連休後半からちびちびやってたので2-3日かかってますけど・・・。


http://blog.technohippy.net/box2djs/demo.html (まだFireFox限定)
http://box2d-js.sourceforge.net/

とりあえず、円と、四角と、多角形と、回転ジョイントを試してみました。


ホントに中身を一切理解しないまま置換しただけなので、上のデモで使ってない機能が動くかどうかは謎。というか、たぶんいくつかは動かないと思う。


もう少しきちんと確認したら、ソースを整理してSourceForgeかなにかに上げます。が、とにかく動いたのがうれしいのでとりあえず公開。(もう10倍くらい早く動いたら実用に足るんだけどなぁ・・・)


コード抜粋
当たり前だけど、型を書かないことを除けば使い方はBox2DFlashAS3と同じです。

// Worldを生成
function createWorld() {
  var worldAABB = new b2AABB();
  worldAABB.minVertex.Set(-1000, -1000);
  worldAABB.maxVertex.Set(1000, 1000);
  var gravity = new b2Vec2(0, 300);
  var doSleep = true;
  return new b2World(worldAABB, gravity, doSleep);
}

// 円を生成
function createBall(world, x, y) {
  var ballSd = new b2CircleDef();
  ballSd.density = 1.0;
  ballSd.radius = 10;
  ballSd.restitution = 0.2;
  var ballBd = new b2BodyDef();
  ballBd.AddShape(ballSd);
  ballBd.position.Set(x,y);
  return world.CreateBody(ballBd);
}

// シミュレーションを1ステップ進める
world.Step(timeStep, iteration);