2012年10月15日月曜日

ODE 0.12をGIMPACTで再コンパイル

先月、「ODE 0.12にアップデイト」というBlogエントリを書いたのですが、OpenSim ODEで検索してたら、次のような記事を見つけました。これは、opensim-devのメーリングリスト(ML)に投稿されたもののアーカイブのようです。
Prospective ODE physics changes (将来のODE物理に関する変更)
http://opensim-dev.2196679.n2.nabble.com/Prospective-ODE-physics-changes-td7144808.html
このMLのスレッドは、18個ほど投稿がされています(Threadedのリンクをクリックするとスレッド一覧が見れます)。

議論の中身はあんまり理解できない(^_^;)のですが、collider(コライダー? 衝突検出器?)に従来のOPCODEではなく、GIMPACTを使ったほうがクラッシュしにくいとか、[ODEPhysicsSettings]の中の contacts_per_collision というパラメータを80からもっと小さい値にしてもいいんじゃないか、とかが議論されています。まあ、詳しくは、上記MLのスレッドをご覧ください。

ODE 0.12の再構築

前回のODE 0.12のコンパイルでは、「http://opensimulator.org/wiki/PhysicsEngines」の内容に従って、configureのオプションを決めたのですが、今回は「--with-trimesh=gimpact」のオプションをつけることにします。

まずは、前回の 「ODE 0.12にアップデイト」の手順に従い、ソースコードを取得し、FreeBSD用パッチをあてます。その後、「sh autogen.sh」でconfiguareスクリプトを作成して、次の引数をつけてconfigureを実行します。
# ./configure --disable-asserts --enable-shared --disable-demos --with-drawstuff=none --with-trimesh=gimpact CFLAGS="-O2 -msse -mar
ch=i686" CXXFLAGS="-O2 -msse -march=i686"
ちょっと見ずらいので、複数行で表記すると次のようになります(UNIXのShellは行末に「\」がある場合、次の行と連結して1つの行として扱います)。
# ./configure --disable-asserts --enable-shared --disable-demos \
              --with-drawstuff=none --with-trimesh=gimpact \
              CFLAGS="-O2 -msse -march=i686" \
              CXXFLAGS="-O2 -msse -march=i686"
後は、make & install します。
# make
...
... 
# make install
...
...
この新しいODEのライブラリだと、クラッシュしにくくなったような気がします。

contacts_per_collision パラメーターの調整

OpenSim.iniの [ODEPhysicsSettings] セクションに contacts_per_collisionのパラメータを追加します(ODEに関するパラメータの大部分は、OpenSimDefaults.ini にあります。OpenSim.iniはそれに追加・上書きしています)。
[ODEPhysicsSettings]
    contacts_per_collision = 10
このcontacts_per_collisionの値を小さくすると、物理オブジェクトを使ったときのCPUの負荷が劇的に減ります。10 の値が妥当なのかどうかは判りませんし、なんか乗物等で不都合がでるかもしれません。でも、物理な0.5m角のCUBEを400個くらい積み上げて崩してみても、前よりはアバターが動けるように感じますし、崩れ方・転がり方も、以前よりすこし自然な感じがします。
それと、いまのところクラッシュしていません。まあ、私の主目的は、クラッシュしないことですんで、これでとりあえず良しとします。

物理オブジェクトの掃除のTips

物理オブジェクト を積み上げて崩すという遊びをしていると、コンソールに「 [PHYSICS]: Physical Object went out of bounds.」という警告メッセージがどんどんでたり、あっちこっちに散らばった物理オブジェクトを探し回って消さなくてはいけなくなることがあります。
こんな場合、OpenSimの次のようなコンソールコマンドを使うと便利です。
delete object outside - Delete all scene objects outside region boundaries
delete object name [--regex]  - Delete a scene object by name.
show object name [--regex]  - Show details of scene objects with the given name.

範囲外にでたオブジェクトは、「delete object outside」コマンドで削除します。
物理オブジェクトに、あらかじめ特徴的な名前をつけておいて、「delete object name --regex オブジェクト名の正規表現」とすれば、探し回わって消さなくてもすみます。間違って他のオブジェクトを消してしまわないように、あらかじめ、「show object name --regex ...」で消すオブジェクトを確認しといたほうがいいかもしれません。


a

0 件のコメント:

コメントを投稿