ODE講座12:インタラクティブにいこう!

前回質問を募集したところ,貴重な質問を頂きありがとうございます.初心者用のODE本の原稿を執筆しているところですが,ご質問の内容が抜けていたところもあり参考になりました.今月末の脱稿を目指していますのでまた気軽に質問してください.

さて,今回はODE(Open Dynamic Engine)講座の12回目となります.ご質問の中でインタラクティブにシミュレーションをしたいという要望が多かったのでサンプルプログラム5を作りました.ODEでは,シミュレーション中にキーボードからの入力を受付けますので,入力するキーに対応する関数などを作成するとインタラクティブなシミュレーションが可能となります.ODEもブログもインタラクティブなところが魅力の一つですね.

 以下に重要な部分だけソースコードを示します.このプログラムはsample2を変更し,ボールの他に円柱オブジェクトを表示して,キーボードからの入力により外力を加えたり,シミュレーションの再スタートを可能としています.

 void  prepDrawStuff() {
  fn.version = DS_VERSION;
  fn.start   = &start;
  fn.step    = &simLoop;
  fn.command = &command; // キー入力で呼び出される関数のアドレス
  fn.stop    = NULL;
  fn.path_to_textures = “../../drawstuff/textures”;
}

//キー入力で呼び出される関数
void command(int cmd)
{
  switch (cmd) {

  case ‘s’: dBodyAddForce(pillar.body,50, 0, 0);break;

  case ‘j’: dBodyAddForce(ball.body    ,0,-10, 0);break;
  case ‘k’: dBodyAddForce(ball.body    ,0,  0,50);break;
  case ‘l’: dBodyAddForce(ball.body    ,0, 10, 0);break;
  case ‘r’:restart()                            ;break;
  }
}

 // シミュレーションを再スタート
void restart()
{
  // 破壊だー                                                                             
  dJointGroupDestroy(contactgroup); // 接触点のグループを破壊
  destroyBall();    // ボールを破壊
  destroyCylinder(); // 円柱を破壊

  // 生成                                                                               
  contactgroup = dJointGroupCreate(0); //接触点グループの生成
  createBall();   // ボールの生成
  createPillar();  // 円柱の生成
}

// ボールを破壊する
void destroyBall() {
  dBodyDestroy(ball.body);
  dGeomDestroy(ball.geom);
}

void destroyCylinder() {
  dBodyDestroy(pillar.body);
  dGeomDestroy(pillar.geom);
}

static void simLoop (int pause)
{
 // キーボードからcontrolキーを押しながらpキーを押すと
// シミュレーションが一時停止する
if (!pause) { 
    dSpaceCollide(space,0,&nearCallback);
    dWorldStep(world,0.01);
    dJointGroupEmpty(contactgroup);
  }
  drawObject(ball.geom,1.3,0,0);
  drawObject(pillar.geom,0,0,1.3);
}

 ソースコードはここにありますのでダウンロードして実行してください.
キーボードのs, j ,k, lキーを押すと円柱やボールに外力が働き,rキーを押すとシミュレーションがリスタートし,コントロールキーを押しながらpキーを押すと一時停止します.お試しあれ.

最近は政治の世界でも(党議)拘束がかかるようなので,次回は拘束についてお話したいと思います.

コメントを残す

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