新年のご挨拶 コメントスパム対策をしましました。
1 月 02

新年明けましておめでとうございます。 ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics  Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第14回目です。 ご質問の中でインタラクティブにシミュレーションをしたいという要望が多かったので、今回はその方法を学びます。ODEでは,シミュレーション中にキーボードからの入力を受付けますので,入力するキーに対応する関数などを作成するとインタラクティブなシミュ レーションが可能となります.ODEもブログもインタラクティブなところが魅力の一つですね. 以下に重要な部分だけソースコードを示します.このプログラムはsample2を変更し,ボールの他に円柱オブジェクトを表示して,キーボードからの入力により外力を加えたり,シミュレーションの再スタートを可能としています.
CODE:
  1. /*** 描画の準備 ***/
  2. void  prepDrawStuff()
  3. {
  4. fn.version = DS_VERSION;
  5. fn.start   = &start;
  6. fn.step    = &simLoop;
  7. fn.command = &command; // キー入力で呼び出される関数のアドレス
  8. fn.stop    = NULL;
  9. fn.path_to_textures = "../../drawstuff/textures";
  10. }
  11.  
  12. /** * キー入力で呼び出される関数 ***/
  13. void command(int cmd)
  14. {
  15. switch (cmd) {
  16. case ’s’: dBodyAddForce(pillar.body,50, 0, 0);break; // sキーが押されたらときの処理
  17. case ‘j’: dBodyAddForce(ball.body    ,0,-10, 0);break; // jキーが押されたらときの処理
  18. case ‘k’: dBodyAddForce(ball.body    ,00,50);break; // kキーが押されたらときの処理
  19. case ‘l’: dBodyAddForce(ball.body    ,0, 10, 0);break; // lキーが押されたらときの処理
  20. case ‘r’:restart()                            ;break;       // rキーが押されたらときの処理
  21. }
  22. }
  23.  
  24. /***  シミュレーションを再スタート ***/
  25. void restart()
  26. {
  27. // 破壊
  28. dJointGroupDestroy(contactgroup); // 接触点のグループを破壊
  29. destroyBall();    // ボールを破壊
  30. destroyCylinder(); // 円柱を破壊
  31.  
  32. // 生成
  33. contactgroup = dJointGroupCreate(0); //接触点グループの生成
  34. createBall();   // ボールの生成
  35. createPillar();  // 円柱の生成
  36. }
  37.  
  38. /*** ボールの破壊 ***/
  39. void destroyBall()
  40. {
  41. dBodyDestroy(ball.body);
  42. dGeomDestroy(ball.geom);
  43. }
  44.  
  45. void destroyCylinder()
  46. {
  47. dBodyDestroy(pillar.body);
  48. dGeomDestroy(pillar.geom);
  49. }
  50.  
  51. static void simLoop (int pause)
  52. {
  53. // キーボードからcontrolキーを押しながらpキーを押すと
  54. // シミュレーションが一時停止する
  55. if (!pause) {
  56. dSpaceCollide(space,0,&nearCallback);
  57. dWorldStep(world,0.01);
  58. dJointGroupEmpty(contactgroup);
  59. }
  60. drawObject(ball.geom,1.3,0,0);
  61. drawObject(pillar.geom,0,0,1.3);
  62. }

command関数はキーボードからの入力を処理する関数です。caseの右にある'r'などの文字はキーボードが押された文字に対応します。この部分に必要な処理を書けばインタラクティブなシミュレーションを作ることが可能となります。ここでは、'r'キーが押されるとrestart関数がよばれ、シミュレーションが再スタートされています。 なお、ソースコードはここにありますのでダウンロードして実行してください. キーボードのs, j ,k, lキーを押すと円柱やボールに外力が働き,rキーを押すとシミュレーションがリスタートし,コントロールキーを押しながらpキーを押すと一時停止します.お試しあれ.
投稿:07年01月02日

Leave a Reply

カウンタ (since 2008-1-11)
Copyright © 1998-2008    Kosei Demura