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に処理させる事は可能なのでしょうか?

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

コメントを残す

メールアドレスが公開されることはありません。