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