以前から興味のあった、ActionScript3の物理エンジン「Box2DFlashAs3」を試してみました。
参考にしたサイトはこちらです。
- [gihyo.jp]Box2DでActionScript物理プログラミング
- [てっく煮ブログ]Box2DFlashAS3の単純なサンプルと使い方(2.0.2版)
- [てっく煮ブログ]DebugDrawを使わないBox2DFlashAS3のサンプル(2.0.2版)
- [memo. at sonic]Box2DFlashAS3(2.0.0)を使ってみる – その5(Joint編)
1と4のサイトは2.0.0での説明ですが、2009/5/21時点での最新は2.0.2となっており、若干APIの仕様が変わっていますので相違点はてっく煮さんのサイト を参考にすればとりあえず問題ないと思います。
ちなみにBox2DFlashAS3を使った実際のFlashは1のサイトでもいくつか紹介されていますが、個人的にはこちらがおすすめです。
今回作成してみたサンプルはこちらです。
画像をクリックすると別画面でFlashPlayerが起動します。
Flash画面上をマウスで選択してからキー入力「1~6」で人形がぐにゃぐにゃ動きます。
( こんがらがって身動きが取れない場合もありますがそれはご愛嬌ということで。。。)
※動作確認はVista/Chrome/FlashPlayer10でやってますので、環境によっては動かないかもしれません。
「サンプルその1」と「サンプルその2」の違いはDebugViewを使っているかいないかだけです。ともに上下左右を固定壁で囲んでおり、人形が外にでないようにしています。人形は複数のパーツ(b2Body)で構成されており、各パーツを「b2DistanceJointDef」という種類のジョイントでつなげています。ジョイントには色々種類があるのですが、今回は一番シンプル(と思われる)ジョイントを使ってみました(サンプルその1で青線で表示されているのがジョイントです)。
今回のサンプル作成にあたって苦労した点は以下になります。
- ジョイントによるパーツ結合
当初は各パーツをひとつのジョイントで繋いでいたのですが、動きが安定しなかったり、ちぎれてしまったりと色々問題があったのでところどころ複数ジョイントを使うことで奇跡的に安定化させています(苦。「b2DistanceJointDef」には『dampingRatio』『frequencyHz』という属性があるので、その辺りをうまく設定してやればもしかしたら、一本で問題ないのかもしれません 。
- 各パーツのバランス今回人形を作成するにあたって頭から序所にパーツを作成して結合していったのですが、どんどんバランスが崩れてなかなか安定して立つことができませんでした(今も安定してるかといわれると・・・)。 コツとしては重心が下になるように各パーツの密度を設定してやるといいかもしれません。具体的には今回のサンプルでは『頭<<胴体=足上部<<<<<足下部』というような密度設定をしてあげています(腕については重過ぎるとバランスを崩す要因になりそうなので頭よりも軽くしています)。
サンプル作成時のソースですが、残念ながらお見せするほど奇麗なものではないので、どうしてもほしいという人がいたらコメントを頂ければ個別に対応しちゃうかもしれません。