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  先頭のコメントを外すと描画します。

重心位置の表示を止めると更に速くなりますよ。今回はこれでおしまい。

3 Responses to “ 14. 描画をしないでスピードアップ ”

  1. tama MonsterID Icon tama 2009-12-12

    このサイトでODEのライブラリを知った者です。
    それで、今回質問をさせて頂こうと思いまして投稿します。

    上の講座でdrawstuffを使用しないでシミュレーションをされていますが、この
    方法を使って描画部分をDirectXに処理させる事は可能なのでしょうか?

    もし可能でしたら、注意する点(例:座標等)とかございましたらご教授下さい。

  2. demu MonsterID Icon demu 2009-12-13

    tamaさん,

    drawstuffと同じ機能をものをDirectXで書く必要があります.

    ちなみに,ODEの座標系は右手系です.

    なお,私は,irrlichtというグラフィクスライブラリを使いdrawstuff上位互換のライブラリを作っています.それはDirectXでも動く予定です.

    でむ

  3. tama MonsterID Icon tama 2009-12-14

    irrlichtというライブラリは知っています。
    公開されたら試してみたいです。

コメントどうぞ (Leave a Reply)

カウンタ (since 2008-3-15)