14. 描画をしないでスピードアップ
ODE(Open Dynamics Engine初級講座の第14回目です。今回はODEについている3Dグラフィクスライブラリdrawstuffを使わずにシミュレーションをスピードアップする方法をご説明します。
drawstuffはODEの一部ではなく、テストプログラムを表示するためのいわばオマケで、OpenGLをベースに作られています。とてもシンプルでソースコードもあるのでOpenGLを勉強するにはとても良い教材だと思います。
描画しない方法はとても簡単です。テストプログラムではdsSimulationLoopをmain関数の中で呼び出しています。この部分が描画ループを呼び出しシミュレーションの各ステップで描画やキーボードからのイベント処理をしているので、これを呼び出さなければOKです。
さらに,simLoop関数の中でも描画している部分があるので、そこも呼び出さないようにする必要があります。
つまり、以下のようにしてください。
- 描画をする場合
static void simLoop (int pause)
{ // 必要な処理に関するコードをここに書く。
dSpaceCollide(space,0,&nearCallback);
dWorldStep(world,0.01);
dJointGroupEmpty(contactgroup);
drawSphere(torso.geom);
}
int main(int argc, char *argv[])
{
// 略
dsSimulationLoop(argc, argv, 640, 480, &fn);
// 略
}
- 描画をしない場合
static void simLoop (int pause)
{
// 必要な処理に関するコードをここに書く。
dSpaceCollide(space,0,&nearCallback);
dWorldStep(world,0.01);
dJointGroupEmpty(contactgroup);
// drawSphere(torso.geom); 描画はしないのでコメントアウト
}
int main(int argc, char *argv[])
{
// 略
while (1) {
simLoop(0); // 引数は必ず0にしてください。
}
// 略
}
なお、描画をしないで、バウンドするボールの重心位置をターミナルに表示するサンプルプログラム14を作りました。
以下に示す13行目にある先頭の//を外すと描画するようになりますので速さを比較してください。
// #define DRAW 先頭のコメントを外すと描画します。
重心位置の表示を止めると更に速くなりますよ。今回はこれでおしまい。

このサイトでODEのライブラリを知った者です。
それで、今回質問をさせて頂こうと思いまして投稿します。
上の講座でdrawstuffを使用しないでシミュレーションをされていますが、この
方法を使って描画部分をDirectXに処理させる事は可能なのでしょうか?
もし可能でしたら、注意する点(例:座標等)とかございましたらご教授下さい。
tamaさん,
drawstuffと同じ機能をものをDirectXで書く必要があります.
ちなみに,ODEの座標系は右手系です.
なお,私は,irrlichtというグラフィクスライブラリを使いdrawstuff上位互換のライブラリを作っています.それはDirectXでも動く予定です.
でむ
irrlichtというライブラリは知っています。
公開されたら試してみたいです。