ActionScript3.0用の3D物理エンジンを作ってみた

 

3D物理の勉強も兼ねて、ActionScript3.0で動く
OimoPhysicsという3D物理エンジンを作りました。

>> Launch Pyramid demo

 

まだ製作途中ですが、とりあえず箱が動かせるようになったので記事にしました。
ちゃんと使えるようになるまでは、まだしばらくかかりそうです。

2Dの物理エンジンは何度か作ったことがありましたが、
一つ次元が増えるだけで、こんなにも大変になるとは想像も付きませんでした…

 

どうしてもたくさん箱を積み重ねてドカーンしたかったので、
動作速度に一番力を注ぎました。
鬼のような最適化やインライン展開の甲斐あって、
最初の頃より10倍以上高速化することができました。

インライン展開は可読性は落ちてしまいますが、その分の効果は大きいです。
(特に箱同士の衝突検出のコードは大変なことになってしまいました)

そんなこんなで今の所、AS3の3D物理エンジンでは一番高速に動作するはずです。

 

同じAS3の3D物理エンジンAwayPhysicsとの比較用に、
6x6x6の箱を積み重ねるデモを作ってみました。
(AwayPhysicsの方は、サンプルを少し弄った程度ですが…)

追記あり

>> Launch Box demo

>> Launch Box demo (AwayPhysics Ver)
>> Launch Box demo (Faster, AwayPhysics Ver: by muzer)

>> Launch Box demo (OimoPhysics on Away3D Ver: by muzer)

 

10/16 追記:muzerさんが、AwayPhysicsのより高速なデモと、
OimoPhysicsをAway3D上で動かすデモを作って下さいました!
thank you, muzer! :D

結果、AwayPhysicsが相当速くなりました。
ソルバの繰り返し回数等が不明なので、あまり細かい比較はできないですが、
大体OimoPhysicsと同じくらいの速度で動いてます。

がしかし、色々試してみましたが、自分の環境ではどうやっても
この速度は出せず…

そもそもswfのデータ構造が違うようなので(Unityから書き出されたswfと同じ?)、
コンパイラが違うのかもしれないです。

高速なAwayPhysicsを使うためには、
普通にライブラリとしてインポートするだけでは不十分なようです。
うーむ…

 

今の所使える機能は、

  ・プリミティブな形状 (球体、箱)
  ・ひとつの剛体に複数の形状を使用
  ・Sweep And Prune による高速な広域衝突判定
  ・安定したスタッキング (Warm Start)

と少なめですが、今後は

  ・ジョイントのサポート(距離、ボール、ヒンジ、2軸ヒンジなど)
  ・連続衝突検出 (Continuous Collision Detection、高速で動く物体がすり抜けない)
  ・他のプリミティブな形状(カプセル、シリンダー、コーンなど)
  ・レイキャスト
  ・静的な剛体の三角ポリゴンメッシュ

などの機能も実装していければと思っています。

 

また、OimoPhysics は MIT License の下、オープンソースで開発しています。

ソースコードはこちら(GitHub)に置いてあります。

まだ突然クラスや関数が消滅したり名前が変わったりするかもしれないですが、
自由に試していただいて構いません。

 

最後に、開発にあたっては、衝突応答部分に Box2D を、
広域衝突判定に Bullet Physics を、
詳細な衝突判定に Open Dynamics Engine を参考にさせていただきました。

先人達の素晴らしい知恵と技術に感謝です。

10 Responses to “ActionScript3.0用の3D物理エンジンを作ってみた”

  1. nullpoP より:

    上と下はつながっているのですか?
    ボールが台から落ちた後、ボールと台が同時に見えるようにしてしばらく待つと
    バグりました。
    (突然画面が変わる)

  2. ben w より:

    I don’t speak a word or Japanese, but really well done! This looks very promising so far!!! Keep it up, the flash community needs a fast opensource 3D physics engine!!

  3. edi より:

    Congrats..

    Did You try connect ur engine with any 3d framework???

    It could be nice do performance testes with Yr engine with away3d.

    Regards

  4. zworp より:

    Very impressive!

  5. muzer より:

    Hi, greate work!
    here is OimoPhysics with Away3D test: http://muzerly.com/test/OimoAway3DTest.html
    and awayphysics test: http://muzerly.com/test/BasicTest.html

  6. hutu より:

    ちゃんと動くし楽しいです

  7. […] githubページ 今回紹介した中では唯一の純国産ライブラリ。物理エンジンに特化しています。 紹介記事 […]

Leave a Reply for ben w