いままで、ODE(Open Dynamics Engine)は、FreeBSDのPorts(devel/ode)のものを使ってました。このバージョンは 0.11.1です。いま、
ODEプロジェクトのホームページを確認したら、0.12がでていました。0.11.1が出たのが 2009-10-17で、0.12が2012-05-28 ですので、いろいろとバグが修正されていることが期待できます。まだ、Portsは0.11.1のまんまなんで、ここは手動でソースコードからライブラリをインストールすることにします。
automakeをインストール
ODEのコンパイルには、automakeが必要ですので、Portsからインストールします。
# cd /usr/ports/devel/automake && make install clean
依存関係のあるPortsもあわせてインストールされますが、まあ、気にしない。
automakeはODEをコンパイルする為だけに必要で、実行時には必要ありません。
ソースコード取得とパッチあて
ODEのサイトの download のリンクをたどると、
sourceforgeのサイトにいきます。そこから、「ode-0.12.tar.bz2」をダウンロードし、展開します。ダメなら、ブラウザ等でいったんダウンロードしてから、FreeBSDに転送します。
# fetch http://sourceforge.net/projects/opende/files/ODE/0.12/ode-0.12.tar.bz2
# tar xvzf ode-0.12.tar.bz2
...
... ファイルが展開される
...
展開したソースコードのMakefile.amに次のパッチを当てます。
こちらからダウンロードするか、コピペして、「ode-0.12_freebsd.patch」というファイル名で保存してください。
--- Makefile.am.orig 2012-02-12 07:03:27.000000000 +0900
+++ Makefile.am 2012-09-19 21:24:49.000000000 +0900
@@ -40,5 +40,5 @@
CHANGELOG.txt INSTALL.txt README.txt LICENSE.TXT \
bindings
-pkgconfigdir = $(libdir)/pkgconfig
+pkgconfigdir = $(libdir)data/pkgconfig
pkgconfig_DATA = ode.pc
このパッチを当てないと、monoがlibode.soを見つけられなくてエラーになります。odeのソースコードがFreeBSDの devel/pkgconf の仕様に適合してない為みたいです。
# cd ode-0.12
# patch -p1 < /some/where/ode-0.12_freebsd.patch
configure & make
パッチがあたったら、sh autogen.shを実行して、configureスクリプトを作成します。
# sh autogen.sh
次にconfigureスクリプトに、次の引数をつけて実行します。
# ./configure --disable-asserts --enable-shared --disable-demos --with-drawstuff=none CFLAGS="-O2 -msse -march=i686" CXXFLAGS="-O2 -msse -march=i686"
CFLAGSとCXXFLAGSに「-O2 -msse -march=i686」をつけているのは、IntelCPUのSSE命令などをつかって、ちょっとでも最適化し、性能を上げようとしてます。サーバーのCPUのアーキテクチャにあわせて、適切なものに変えるといいかもしれません(どのくらいパフォーマンスが稼げるのかは不明)。
では、ソースコードをmakeし、エラーがなければインストールします。
# make
...
...
# make install
...
...
インストールが完了したら、OpenSim.exeを再起動します。エラーなく起動されればOK。
動作確認
さて、うまくうごいているか動作を確認してみます。
まずは、CUBE を500個だし、物理属性をつけます。
だんだん崩れていきます。
ぺっちゃんこになりました。
さすがに、500個も物理オブジェクトを出すと、身動きがとれません。ちなみにOpenSimを動かしているコンピュータは、Intel ATOM D525、メモリ4GBです。
CUBEの中を歩き回ります。まともに動けませんけど、OpenSimは落ちないみたいです。
この時の、topコマンドによるプログラムの状態は、次の通りです。
last pid: 86961; load averages: 1.13, 0.77, 0.48 up 5+10:20:55 01:07:55
93 processes: 2 running, 88 sleeping, 3 stopped
CPU: 25.5% user, 0.0% nice, 2.3% system, 0.0% interrupt, 72.1% idle
Mem: 503M Active, 2020M Inact, 224M Wired, 61M Cache, 112M Buf, 188M Free
Swap: 2048M Total, 2528K Used, 2045M Free
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
86679 opensim 53 44 0 413M 322M ucond 3 10:17 104.98% mono
1673 mysql 16 50 0 192M 45656K sigwai 2 7:24 0.00% mysqld
2242 opensim 1 44 0 11900K 8732K select 0 0:54 0.00% screen
68091 opensim 1 44 0 3688K 1688K CPU2 1 0:04 0.00% top
1685 root 1 44 0 3384K 1120K nanslp 1 0:04 0.00% cron
1460 root 1 44 0 3352K 1096K select 1 0:03 0.00% syslogd
.....
.....
.....
重いのは重いけど、sshで接続しているセッションは普通に操作できます。
また、私のリージョンサーバーは、現在4つのリージョンがあるのですが、CUBEをぶちまけた隣のリージョンにテレポートしたら、そこでは普通にうごけました。
また、500個も物理オブジェクトをぶちまけると、次のような警告がOpenSimのコンソールに沢山でます。
01:04:41 - [PHYSICS]: Physical Object went out of bounds.
01:04:41 - [PHYSICS]: Physical Object went out of bounds.
...
... 途中省略 ...
...
01:05:01 - [PHYSICS]: Physical Object went out of bounds.
01:05:03 - [PHYSICS]: Physical Object went out of bounds.
01:05:03 - [PHYSICS]: Physical Object went out of bounds.
Region (root) #
これらのオブジェクトは、地面の下にもぐっていたり、リージョン境界でぐるぐるまわってたり、隣のリージョンまでいってしまってたりします。ビュアーのArea Search等で、オブジェクトを探して、一つ一つ削除していかないといけなくなります(>_<)。作業を簡単にするため、あらかじめ物理オブジェクトには、検索しやすいような名前をつけておくことをお勧めします。
まとめ
まだ、もっと様子をみないといけないけど、ODEがいきなり落ちてしまうということはなくなったかもしれません。