Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2011-11-03

bullet

14:20

今作ってる WebGL のプログラムbullet が使いたいので調べてる。


bullet.js

C++ の物理エンジンである bullet が Java に移植されたものが jbullet で、jbullet が JavaScript に移植されたものが bullet.js。

bullet.js は pl4n3 という人がブログに載せたデモページの中にあって、github 等の公式レポジトリは無い。他人が転載したやつはあるけどメンテされてない。

jbullet のバージョンは本家 bullet より遅れてて、特に MMD で使ってる btGeneric6DofSpringConstraint という関数が無いらしい。

また bullet.js は、一緒に移植されてる行列演算用のライブラリ Vecmath に依存してて、glMatrix などの好きな行列演算ライブラリをそのまま使うことはできない。数字だけコピーすれば大丈夫なのであんまり気にする必要はないかも?

f:id:edvakf:20111103140336p:image

↑WebGL じゃなくて 2D Canvas でやってる。fps はかなり良い。


ammo.js

そういうことで、最新の bullet を Emscripten で JS にした ammo.js というのが作られた。

bullet.js と比べてパフォーマンスがどうなのか気になるところ。↑のサンプルコードのデモだと fps がかなり悪いけど、↓だとそこまで酷くない。

この人の感想によると、メモリリークが激しいとかなんとか。うちではそんなことは無い気がするんだけど。ammo.js の readme の説明にある destroy はちゃんと呼んでるんだろうか。あと C++ でコンストラクターが複数あると JS からは最初の一つしか使えないとか。

f:id:edvakf:20111103141709p:image


NaCl

C++ 版の bullet が変更なしで NaCl でビルドできるらしい。

Chrome Web Store 限定になるのであまり魅力を感じないが、もし今作ってるやつの物理演算バックエンドを切り替えられるようにするとしたら、これを使うのもありかもしれない。

デモはダウンロードして走らせてみた。bullet の部分だけじゃなくてアプリケーションも全部 NaCl で作られてる。

物理演算だけ NaCl にやらせることもできるんだろうか(たぶんできる)。その場合は postMessage を使った非同期通信になってしまうはず。まあどちみち物理演算をやるなら Workers の中でやらないとスピードがキツいと思うので、postMessage の向こうをブラックボックスにしてしまえばあまり特別な手間をかけなくても使えるかも。

f:id:edvakf:20111103141815p:image


その他

そもそも bullet じゃないといけないのかどうか知らない。JigLib というのが JS にポートされてて良さげな感じではある。

f:id:edvakf:20111103144338p:image

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20111103
 |