ODE講座12:インタラクティブã«ã„ã“ã†ï¼

2006-02-05
By

å‰å›žè³ªå•を募集ã—ãŸã¨ã“ã‚,貴é‡ãªè³ªå•ã‚’é ‚ãã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ï¼Žåˆå¿ƒè€…用ã®ODE本ã®åŽŸç¨¿ã‚’åŸ·ç­†ã—ã¦ã„ã‚‹ã¨ã“ã‚ã§ã™ãŒï¼Œã”質å•ã®å†…å®¹ãŒæŠœã‘ã¦ã„ãŸã¨ã“ã‚ã‚‚ã‚りå‚考ã«ãªã‚Šã¾ã—ãŸï¼Žä»Šæœˆæœ«ã®è„±ç¨¿ã‚’目指ã—ã¦ã„ã¾ã™ã®ã§ã¾ãŸæ°—軽ã«è³ªå•ã—ã¦ãã ã•ã„.

ã•ã¦ï¼Œä»Šå›žã¯ODE(Open Dynamic Engine)講座ã®ï¼‘2回目ã¨ãªã‚Šã¾ã™ï¼Žã”質å•ã®ä¸­ã§ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒ†ã‚£ãƒ–ã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ã—ãŸã„ã¨ã„ã†è¦æœ›ãŒå¤šã‹ã£ãŸã®ã§ã‚µãƒ³ãƒ—ルプログラム5を作りã¾ã—ãŸï¼Žï¼¯ï¼¤ï¼¥ã§ã¯ï¼Œã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ä¸­ã«ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‹ã‚‰ã®å…¥åŠ›ã‚’å—付ã‘ã¾ã™ã®ã§ï¼Œå…¥åŠ›ã™ã‚‹ã‚­ãƒ¼ã«å¯¾å¿œã™ã‚‹é–¢æ•°ãªã©ã‚’作æˆã™ã‚‹ã¨ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒ†ã‚£ãƒ–ãªã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ï¼Žï¼¯ï¼¤ï¼¥ã‚‚ブログもインタラクティブãªã¨ã“ã‚ãŒé­…力ã®ä¸€ã¤ã§ã™ã­ï¼Ž

 以下ã«é‡è¦ãªéƒ¨åˆ†ã ã‘ソースコードを示ã—ã¾ã™ï¼Žã“ã®ãƒ—ログラムã¯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キーを押ã—ãªãŒã‚‰ï½ã‚­ãƒ¼ã‚’押ã™ã¨
// シミュレーションãŒä¸€æ™‚åœæ­¢ã™ã‚‹
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キーを押ã™ã¨ä¸€æ™‚åœæ­¢ã—ã¾ã™ï¼ŽãŠè©¦ã—ã‚れ.

æœ€è¿‘ã¯æ”¿æ²»ã®ä¸–界ã§ã‚‚(党議)拘æŸãŒã‹ã‹ã‚‹ã‚ˆã†ãªã®ã§ï¼Œæ¬¡å›žã¯æ‹˜æŸã«ã¤ã„ã¦ãŠè©±ã—ãŸã„ã¨æ€ã„ã¾ã™ï¼Ž

コメントをã©ã†ãž

メールアドレスãŒå…¬é–‹ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。

268 views  (Since 2010-08-11)