プログラミング兼読書日記

プログラミングをしていて、はまってしまった事を中心に記事にしています。

2D物理エンジンAPE

 今回はいつも使っている2D物理エンジンを紹介します。APE(ACTION SCRIPT PHYSICS ENGINE)です。以下のような特徴があります。

  1. 使える形状は四角と円のみ
  2. 四角は回転できるが、トルクには対応していない
  3. 円は回転物体として取り扱うこともできる
  4. ConstraintはAngularConstraint(javaでは未実装)とSpringConstraintが使える
  5. 空間分割処理はしていない
  6. ActionScriptC++Javaバージョンがある
  7. MITライセンスなので改変して、商用に使ってもいい

 機能は少なく、ちょっとした処理に用いるのに適しています。ソースコードがとてもシンプルにできているので、使用目的に応じてカスタマイズしています。例えば、衝突判定のみ有効で衝突処理はしないものや、衝突情報の追加などです。

 以下に簡単な使い方を示します

//APEngineの初期化
APEngine.init((double)1/3);
APEngine.setCollisionResponseMode(APEngine.SELECTIVE);
//ここから物体の追加
RectangleParticle rp= new RectangleParticle (0,0,20,20,0,true,1.0,0,0);//x,y,width,height,rotation,isFixed,mass,elasticity,friction
CircleParticle cp=new CircleParticle(0,10,5,fales,1.0,0,0)//x,y,radius,isFixed,mass,elasticity,friction
APEngine.addParticle(rp);
APEngine.addParticle(cp);
.
.
.
//以下は毎フレームよび出す
APEngine.step();

 詳しい使い方はサイトからダウンロードできるデモのソースを見てください。

 ソースの構成について少し説明しておきます。APEngine、CollisionDetector、CollisionResolverはstaticメソッドで構成されています。APEngineのstepメソッド下からCollisionDetectorのtestメソッド呼ばれ衝突判定を行い、衝突してたらさらに、CollisionDetectorのtestメソッドからCollisionResolverのresolveParticleParticleが呼ばれ衝突処理を行います。なので、物体の基底クラス AbstractParticleにプロパティを増やし、APEngineのstep、CollisionDetectorのtest、CollisionResolverのresolveParticleParticleあたりを改変すれば、たいていのことはできます。