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 先頭のコメントを外すと描画します。
サンプルプログラムを次からダウンロードできます。
重心位置の表示を止めると更に速くなりますよ。今回はこれでおしまい。