2D物理エンジンAPE
今回はいつも使っている2D物理エンジンを紹介します。APE(ACTION SCRIPT PHYSICS ENGINE)です。以下のような特徴があります。
- 使える形状は四角と円のみ
- 四角は回転できるが、トルクには対応していない
- 円は回転物体として取り扱うこともできる
- ConstraintはAngularConstraint(javaでは未実装)とSpringConstraintが使える
- 空間分割処理はしていない
- ActionScript、C++、Javaバージョンがある
- 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あたりを改変すれば、たいていのことはできます。