flat7th

memo/20120605

created 2012-06-05 modified 2012-06-05 

ODE


リンク備考
ODEOpen Dynamics Engine
ODE-Wiki
Slide作者による手書きスライド14ページ。

リンク備考
ode4jODEのJava移植(ラッパーではなく移植)
ode4j javadoc

ODEとは、オープンソースの
  • 剛体の運動シミュレータエンジンです。
  • コリジョン(衝突)検出エンジンです。

ロープや布はアプリで実装すべきという立場らしいです。
コリジョン検出は、「近い2つのオブジェクトをコールバックで知らせてくれるので、利用者がコードで衝突してるか最終判定する」というつくりのようです。


描画エンジンには、外部のものを利用せず、内製の"drawstuff"というものを使っています。そのさらに内部は、OpenGLです。

 ユーザアプリ
       |____ ODE (C風だがコンパイラはC++)
               |______ drawstuff
                         OpenGL

ode4j


ode4jは、ラッパーではなく移植です。

そのode4j、先週末に最新のODEに対応した版が出たようです。

Eclipse使って、ボールが弾むサンプルを作って見ました。Javaだからか、さすがに200個とかオブジェクト出すと遅くなりますが、

オリジナルのC++版よりもAPIの作りがオブジェクトライクで、わかりやすくできています。

ODEの、Cっぽい(平たい)APIに挫折ぎみだった方がおられたら、ode4jのオブジェクトっぽい(立体的な?)APIでやってみるとよいのではないでしょうか。

なお、ode4jは、内部にLWJGL(Light Weight Java Game Library) を利用しています。その先がOpenGLであるのは、オリジナルのODEと同じ。

 ユーザアプリ
       |____ ode4j (ODEのJava移植)
               |______ drawstuff (のJava移植)
                         LWJGL
                         OpenGL

リンク備考
LWJGL Light Weight Java Game Library

プログラミング言語研究者にも比較対象としておすすめ


私は言語としてはCのほうがJavaより好きなのですが、この二者については Java 版の優秀さを褒めない訳にはいきません。
この例は、プログラミング言語文法の研究者にも、貴重なサンプルになると思います。
サンプルを実行しながら、クソッ、Javaのくせに、Javaのくせに、とか思ってました。

ode4jの作者さんの言から自分なりに解釈すると:
例えば、あるAPIのパラメータにオブジェクト(構造体)を渡す場合、それが rvalue でよいところで ODEでは lvalue を使うようになっているが、これは (1)ソースが分かりにくくなる原因となる (2)言語系による最適化の可能性を阻害する わけです。

とまぁこんな感じで、計算機科学屋にも非常に興味深いライブラリなので、ODEとode4j、ぜひ見てみてください。

難点

褒めてばっかりだとアレなんで、悪いところも指摘。

ODE も、ode4j も、サンプルプログラムで「モデル」と「ビュー」の分離ができてなくて、初学者にやさしくない。

まぁ、それを差し引いてもよくできていますよ。