ODE講座18:描画をしないでスピードアップ

1月22日~24日までKITの池の平セミナーハウスへ学生といってまいりました。今年は雪が少なく池の平温泉スキー場でも積雪が1mしかありませんでした。それでも滑るには十分な量で学生達とスキーやスノボーを満喫しました。それにしても、最近の若者はスノーボードしかやりません。スキーをやっている人はオヤジやご老人がほとんどでしたが、ご老人(推定年齢70歳)のスノーボーダーを発見して勇気付けられました。そのおじいちゃんは全身銀色のウェアを身にまとい、頭に銀色のヘルメットをかぶり、もの凄い速さでかっ飛ばしています。私もそれに刺激を受け、久しぶりにスノボーにチャレンジしましたが、簡単ではありません。それでも、七転び八起きしながらなんとか滑れるようになったのが今研修の成果?でした。

体がズキズキ痛みますが、ゲーム開発やロボットの研究者にも広く使われているオープンソースの物理計算エンジンODE(Open Dynamics  Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第18回目をはじめましょう。今回はODEについている3Dグラフィクスライブラリdrawstuffを使わずにシミュレーションをスピードアップする方法をご説明します。

drawstuffはODEの一部ではなく、テストプログラムを表示するためのいわばオマケで、OpenGLをベースに作られています。とてもシンプルでソースコードもあるのでOpenGLを勉強するにはとても良い教材だと思います。

描画しない方法はとても簡単です。テストプログラムではdsSimulationLoopをmain関数の中で呼び出しています。この部分が描画ループを呼び出しシミュレーションの各ステップで描画やキーボードからのイベント処理をしているので、これを呼び出さなければOKです。simLoop関数の中でも描画している部分があるので、そこも呼び出さないようにする必要があります。

つまり、以下のようにしてください。


  • 描画をする場合

[code]
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);

}
[/code]

  • 描画をしない場合

[code]
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にしてください。
}

}
[/code]

今回はこれでおしまい。

2 Comments
  1. CohCohさん、

    補足するとdsで始まるAPIはdrawstuffのものです。描画をしないときはそれらを全て呼び出さないでください。また何かあったらコメントをください。

  2. 早速の御回答本当にありがとうございます。
    大変参考になりました。
    これで計算時間の大幅なスピードアップがはかれると思います。

コメントを残す

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