開発日誌

【AS3】物理エンジン「APE」と「Box2D」の比較

ActionScript3で使える2D物理エンジンについて紹介します。
物理エンジンとは、物体の動きをシミュレーションするためのソフトウェアで、ASでは主にライブラリとして提供されています。

中でも有名な2つの物理エンジンライブラリ、「APE」と「Box2D」について同様のサンプルを作成し、
簡単に比較をしてみたいと思います。

サンプルの仕様は、四角の図形と円をジョイントでつなぎ、円の部分でドラッグができる
というものにします。

サンプルflaファイルはこちら
■APE

■Box2D



ライブラリはそれぞれ以下のリンク先からダウンロードできます。
<APE>
http://www.cove.org/ape/

<Box2D>
http://sourceforge.net/projects/box2dflash/
※AS3用のライブラリは、正しくは「Box2DFlashAS3」なので、注意してください。


では、いくつかの項目に基づいて、比較をしていきます。
ぜひサンプルコードと照らし合わせながら、読んでいただければと思います。


物理エンジンのセットアップ


    物理エンジンは、Flash内に空間を定義し、その中で物理演算をするようにしています。
    APEは「コンテナ」、Box2Dは「ワールド」という名前で定義しているようです。

    APEは物体の位置などをピクセルで計測しますが、Box2Dは「メートル」で計測します。

    その他、重力などの項目を設定します。
    (APEでは、APEngine.addForceメソッド、 Box2Dでは、b2Worldコンストラクタで設定します)

    設定する項目自体に大きな違いはありませんが、
    Box2Dは単位がピクセルではなくメートルで計測する点が特徴的です。

オブジェクトの配置


    矩形や円、多角形などの図形オブジェクトを生成します。

  ●APE
    図形の形に応じたクラスのコンストラクタで設定、コンテナに配置します。

    例えば、
     四角=RectangleParticleコンストラクタ   
      設定する項目:X, Y, 幅, 高さ, 回転, 位置の固定(物体が動くか動かないか), 質量, 弾力, 摩擦
     円=CircleParticleコンストラクタ
      設定する項目:X, Y, 半径, 位置の固定, 質量, 弾力, 摩擦
    GroupクラスのaddParticleメソッドに生成した図形をセットし、
    APEngineクラスのaddGroupメソッドにそのGroupをセットすることで、ステージ上に生成します。
    ※APEでは、「グループ」という概念があり、グループ内のオブジェクト同士が、衝突するかしないかを設定します。

  ○Box2D
    いくつかのクラスを使い、位置・図形のサイズ等・描画の手順で生成します。
    ・位置を設定=b2BodyDefクラス
     例)b2BodyDefクラス.position.Set(x,y)    ※単位はm
    ・図形の形・サイズなど設定=b2PolygonDefクラス(四角), b2CircleDefクラス(円)
     例)b2PolygonDefクラス.SetAsBox(w, h)
        b2CircleDefクラス.radius = radius
        また、密度や反発係数なども設定できます。
    ・図形を描画=b2Bodyクラス
    例)b2Worldクラス.CreateDynamicBody(b2BodyDefクラス)    //動く
       b2Worldクラス.CreateStaticBody(b2BodyDefクラス)    //動かない           
    ・最後に、b2Body.CreateShapeメソッドで、ワールドに配置します。

    オブジェクトの生成方法だけでも、かなりの違いがあることがわかります。
    APEはクラス1つで図形を定義しますが、Box2Dは複数のクラスを使って図形を定義しています。

ジョイント


    物体と物体をつなぐ、ジョイントを生成できます。
    (上記のサンプルで、円と四角をつないでいる線をさします)

  ●APE
    SpringConstraintクラスを使います。
      SpringConstraintクラスのコンストラクタで、つなぐ物体Aと物体B、ジョイントの強さ(低いとバネのように跳ね返り、高いと跳ねません)を設定。
      それをGroup.addConstraintメソッドで生成します。
      全てのジョイントを、このクラスで生成します。
 
  ○Box2D
     多彩な種類のジョイントが用意されています。
     物体の距離を一定に保つジョイント、ピストンのような動きをするジョイント、
      関節のような働きをするジョイントなどがあります。


マウス


    たとえば、物体をドラッグする処理を例に比較します。
 
  ●APE
     APEにはマウス操作の機能が用意されていないため、ある程度自作する必要があります。
     パーティクルにspriteプロパティがあり、それを介してイベントリスナの設定、
      移動後の座標など設定する必要があります。
     ※サンプルは動作が少しおかしいです...すみません。
 
  ○Box2D
     b2MouseJointDefクラスを使うことで、簡単に実現できます。
     先ほど説明したジョイントの、マウスと物体をつなぐものと考えてください。

     マウス操作を作りたい場合、Box2Dの方がずっと楽に作ることができます。

ライセンス


  ●APE
     MITライセンスです。
 
  ○Box2D
     zlib/libpngライセンスです。
     商用を含め、任意の目的で利用、改変・再頒布できるライセンスです。
     改変した場合、明示が必要です。


まとめると...
機能としては、Box2Dの方が使いやすいところはありますが、
C言語から移植されているためか、書式がやや特殊でわかりづらい方も多いかもしれません。
APEの方がややすっきり収まる感じもしますので、そのあたりは個々人のお好み、ということになりそうです。

(ただ、Box2Dにはより表記を簡略化したQuickBox2Dというライブラリが存在します。
 こちらも機会があれば、紹介してみたいと思います。)

(kenta)


Webシステムのツボとは

オープンソースの紹介や、プログラミング講座、フリーソフトのレビューなど、Webエンジニアが送る、つれづれ日記。
【隔週金曜日更新】

運営会社:株式会社ジーピーオンライン

RSSを購読する

Monthly Archive