15. キーボード操作と再実行

 

 

ODE (Open Dynamics Engine) 初級講座の第15回目です。

今回はインタラクティブにシミュレーションをする方法を学びます。ODEでは,シミュレーション中にキーボードからの入力を受付けますので,入力するキーに対応する関数などを作成するとインタラクティブなシミュ レーションが可能となります.ODEもブログもインタラクティブなところが魅力の一つですね.

キーボード操作

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

 

/*** 描画の準備 ***/
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; // sキーが押されたらときの処理
    case ‘j’: dBodyAddForce(ball.body ,0,-10, 0);break; // jキーが押されたらときの処理
    case ‘k’: dBodyAddForce(ball.body,0,  0,50);break; // kキーが押されたらときの処理
    case ‘l’: dBodyAddForce(ball.body,0, 10, 0);break; // lキーが押されたらときの処理
    case ‘r’:restart();break;   // rキーが押されたらときの処理
  }
}

/***  シミュレーションを再スタート ***/
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);
}

command関数はキーボードからの入力を処理する関数です。caseの右にある’r’などの文字はキーボードが押された文字に対応します。この部分に必要な処理を書けばインタラクティブなシミュレーションを作ることが可能となります。キーボードのs, j ,k, lキーを押すと円柱やボールに外力が働き,rキーを押すとシミュレーションがリスタートし,コントロールキーを押しながらpキーを押すと一時停止します.

再実行

ここでは、’r’キーが押されるとrestart関数がよばれ、シミュレーションが再実行します。なお、シミュレーションを再実行する場合は最低以下の処理を実行する必要があります。サンプルプログラムでは簡単にするため、ボディとジオメトリを破壊し、再生しています。

  • 接触ジョイント(contact joints)の削除
  • 各ボディの位置と姿勢をリセットする。
  • 各ボディの速度と角速度をリセットする。
  • ジョイントを制御している場合、目標速度と最大発揮トルクをリセットする。

なお、ソースコードは次からダウンロードして実行してください.

こんにちは。今回ODEの勉強をしているstarといいます。
突然ですがこのページでのシミュレータはボールや円柱を手動で動かしていますよね。
思ったんですがシミュレータ内の剛体を重力以外で自動で動かすことはできるんですか?
例えば、ボールを左右に移動し続けるという動作ができると色々と面白いとおもうんですけど。

  • starさん,

    こんにちは.

    できます.
    剛体に力やトルクを加えることができるので,アイディア次第でいろいろと面白いことができます.
    私の講義では,ODEを使いゲームを作る課題を出しています.

    でむ

    • 返信ありがとうございます。
      あれから色々と調べてみたのですが剛体をプログラムで自動操作する方法がどうしても分かりません。
      失礼を承知で方法について教えていただけないでしょうか?

  • コメントを残す

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