ODEã§å­¦ã¶C言語 [Step6: 構造体ã®é…列]

2009-07-17
By

step6サンプルプログラムã®å®Ÿè¡Œç”»é¢

Step5ã§ã¯ãƒœãƒ‡ã‚£ï¼Œã‚¸ã‚ªãƒ¡ãƒˆãƒªï¼Œä½ç½®ï¼Œå§¿å‹¢ï¼Œè³ªé‡ï¼Œã‚µã‚¤ã‚ºãªã©ã®ç‰©ä½“ã®å±žæ€§ã‚’ã¾ã¨ã‚ã¦æ‰±ã†ãŸã‚ã«æ§‹é€ ä½“を使ã„ã¾ã—ãŸï¼ŽStep6ã§ã¯æ§‹é€ ä½“ã®ä¾¿åˆ©ã•を実感ã—ã¾ã—ょã†ï¼Ž

Step5ã®ã‚µãƒ³ãƒ—ルプログラムã§ã¯çƒï¼‘個ã®ãƒã‚¦ãƒ³ãƒ‰ã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ã—ã¾ã—ãŸãŒï¼Œã“ã“ã§ã¯9個ã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’実ç¾ã—ã¾ã™ï¼Žãã®ãŸã‚ã®Step5ã‹ã‚‰ã®å¤‰æ›´ç‚¹ã‚’以下ã«ç¤ºã—ã¾ã™ï¼Žå¤‰æ›´ç‚¹ã¯ãŸã£ãŸã“れã—ã‹ã‚りã¾ã›ã‚“.

ã¾ãšï¼Œæ§‹é€ ä½“変数ã®å¤‰æ›´éƒ¨åˆ†ã§ã™ï¼Žappleã‚’apple[NUM],ã¤ã¾ã‚Šæ§‹é€ ä½“ã®é…列ã«ã—ãŸã ã‘ã§ã™ï¼Žæ§‹é€ ä½“ã®é…列ã¨ã„ãˆã©ã‚‚æã‚Œã‚‹ã«ãŸã‚‰ãšæ™®é€šã®é…列ã®ã‚ˆã†ã«å®£è¨€ã™ã‚Œã°è‰¯ã„ã ã‘ã§ã™ï¼Ž

#define NUM 9

MyObject apple[NUM];

main関数ã®å¤‰æ›´éƒ¨åˆ†ã§ã™ï¼Žãƒªãƒ³ã‚´ã‚’9個作るãŸã‚ã«ï¼Œforループを9回ã—ã¦ã„ã¾ã™ï¼ŽdmSphereCreate()ã®å¤‰æ›´ç‚¹ã¯ï¼‘番目ã®å¼•æ•°ãŒappleã‹ã‚‰apple[i]ã«å¤‰ã‚ã£ã¦ã„る点ã§ã™ï¼Ž

   for (i = 0; i < NUM; i++) {
  	p[1] += 0.5;
	dmSphereCreate(&apple[i],p,R,m,r,color); // リンゴã®ç”Ÿæˆ
  }

simLoop関数ã®å¤‰æ›´éƒ¨åˆ†ã‚‚åŒæ§˜ã§ã™ï¼ŽNUM回æç”»ã™ã‚‹ãŸã‚ã«forループã§å›žã—ã¦ã„ã¾ã™ï¼Ž

   for (i = 0; i < NUM; i++) {
	dmDraw(apple[i]); //  ç‰©ä½“ã®æç”»
  }

ã“れã‹ã‚‰æ§‹é€ ä½“ã®é…列ã¨ã¯é–¢ä¿‚ã‚りã¾ã›ã‚“.Step5ã§èª¬æ˜Žã‚’çœç•¥ã—ãŸã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’説明ã—ã¾ã™ï¼Žã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã¨ã¯é›»è©±ã§ã€Œã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã—ã¦ã­ã€ã¨åŒã˜ã‚ˆã†ã«ï¼Œå¿…è¦ã«ãªã£ãŸã‚‰å‘¼ã³å‡ºã•れる関数ã§ã™ï¼Žã“ã“ã§ã¯ï¼Œï¼’ã¤ã®ã‚¸ã‚ªãƒ¡ãƒˆãƒªãŒè¡çªã—ãã†ã«ãªã£ãŸã‚‰dSpaceCollide()関数ã«ã‚ˆã‚Šå‘¼ã³å‡ºã•れã¾ã™ï¼Žã¤ã¾ã‚Šï¼Œãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯nearCallbacké–¢æ•°ã‚’ä½¿ã†æ™‚を考ãˆãªãã¦æ¸ˆã‚€ã®ã§ãƒ—ログラムã¯ã¨ã¦ã‚‚楽ã§ã™ï¼Ž

nearCallback関数ã®1番目ã®å¼•æ•°dataã¯dSpaceCollide()ã®ï¼’番目ã®å¼•æ•°ã§ã™ï¼Žã“ã“ã§ã¯ã‚りã¾ã›ã‚“.2番目ã¨ï¼“番目ã®å¼•æ•°ã¯è¡çªã™ã‚‹å¯èƒ½æ€§ã®ã‚ã‚‹ï¼’ã¤ã®ã‚¸ã‚ªãƒ¡ãƒˆãƒªã§ã™ï¼Žï¼”è¡Œç›®ã§æŽ¥è§¦ç‚¹æ•°ã®ä¸Šé™ã‚’設定ã—ã¦ã„ã¾ã™ï¼Žãƒãƒªã‚´ãƒ³ãªã©è¤‡é›‘ãªã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’扱ã‚ãªã„é™ã‚Šï¼‘ï¼ã§å分ã§ã™ï¼Žï¼•行目ã®contact[N]ã«ã¯æŽ¥è§¦ç‚¹ãŒæ ¼ç´ã•れã¾ã™ï¼Žï¼˜è¡Œç›®ã®isGroundã¯è¡çªã™ã‚‹å¯èƒ½æ€§ã®ã‚る(ã¤ã¾ã‚Šï¼Œã¾ã è¡çªã—ã¦ã„ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“)ジオメトリã®ã©ã¡ã‚‰ã‹ãŒground(地é¢ï¼‰ã ã£ãŸã‚‰ï¼‘ã«ã‚»ãƒƒãƒˆã•れã¾ã™ï¼Ž

11行目ã®dCollide()ã§æŽ¥è§¦ç‚¹ã®æƒ…報を生æˆã—ã¾ã™ï¼Žæˆ»ã‚Šå€¤ã¯æŽ¥è§¦ç‚¹æ•°ã§ã™ï¼Žã¤ã¾ã‚Šï¼Œã“ã®æŽ¥è§¦ç‚¹æ•°nãŒï¼‘以上ã ã£ãŸã‚‰æŽ¥è§¦ã—ã¦ã„ã‚‹ã‚ã‘ã§ã™ï¼Žï¼‘2行目ã®ifæ–‡ã¯ï¼ŒæŽ¥è§¦ã—ã¦ã„ã‚‹ï¼’ã¤ã®ç‰©ä½“ã®ã†ã¡ã©ã¡ã‚‰ã‹ãŒåœ°é¢ã®å ´åˆã ã‘以下ã®å‡¦ç†ã‚’ã—ã¾ã™ï¼Žï¼‘4行目ã§å発性を設定ã—,15行目ã§å…·ä½“çš„ãªå発係数を設定ã—ã¦ã„ã¾ã™ï¼Žï¼‘6行目ã®bounce_velã¯å発ã™ã‚‹ãŸã‚ã«å¿…è¦ãªæœ€ä½Žé€Ÿåº¦ã§ã™ï¼ŽODEã§ã¯æŽ¥è§¦ç‚¹ãŒã‚¸ãƒ§ã‚¤ãƒ³ãƒˆï¼Œã¤ã¾ã‚Šæ‹˜æŸã¨è€ƒãˆã¦è¨ˆç®—ã—ã¾ã™ï¼Žãã®ãŸã‚,接触ジョイントを作り,2ã¤ã®å‰›ä½“を接触ジョイントã§çµåˆã—ã¦ã„ã‚‹ã®ã§ã™ï¼Ž

// コールãƒãƒƒã‚¯é–¢æ•°
void nearCallback(void *data, dGeomID o1, dGeomID o2)
{
  static const int N = 10; // æŽ¥è§¦ç‚¹æ•°ã®æœ€å¤§å€¤
  dContact contact[N];     // 接触点

  // 接触ã—ã¦ã„る物体ã®ã©ã¡ã‚‰ã‹ãŒåœ°é¢ãªã‚‰isGroundã«éž0をセット
  int isGround = ((ground == o1) || (ground == o2));

  // è¡çªæƒ…å ±ã®ç”Ÿæˆ nã¯è¡çªç‚¹æ•°
  int n = dCollide(o1,o2,N,&contact[0].geom,sizeof(dContact));
  if (isGround)  {
    for (int i = 0; i < n; i++) {
      contact[i].surface.mode = dContactBounce; // å発性ã®è¨­å®š
      contact[i].surface.bounce = 1.0;     // å発係数(0.0ã‹ã‚‰1.0)
      contact[i].surface.bounce_vel = 0.0; // å発ã«å¿…è¦ãªæœ€ä½Žé€Ÿåº¦

      // 接触ジョイントã®ç”Ÿæˆ
      dJointID c = dJointCreateContact(world,contactgroup,
                                                &contact[i]);
      // 接触ã—ã¦ã„ã‚‹ï¼’ã¤ã®å‰›ä½“を接触ジョイントã«ã‚ˆã‚Šæ‹˜æŸ
      dJointAttach(c,dGeomGetBody(contact[i].geom.g1),
                     dGeomGetBody(contact[i].geom.g2));
    }
  }
}

ホームワーク

  1. サンプルコードstep6-090717.zipをダウンロードã—ã¦å®Ÿè¡Œã—よã†ï¼Ž
  2. ドミノ倒ã—
    • çƒã‚’ç´°é•·ã„直方体ã«å¤‰æ›´ã—,ãれを100個生æˆã—,ドミノ倒ã—ãŒã§ãるよã†ã«åœ°é¢ã®ä¸Šã«ï¼‘列ã«ä¸¦ã¹ã‚‹
      • ヒント MyObject構造体ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç›´æ–¹ä½“ã®ã‚µã‚¤ã‚ºã‚’表ã™*sidesを追加ã™ã‚‹ã¨ç°¡å˜ï¼ŽåˆæœŸå€¤ã®è¨­å®šã¯åŒã˜ãƒ¡ãƒ³ãƒãƒ¼ã§ã‚ã‚‹ä½ç½®*pã‚’ã¾ã­ã‚‹ã“ã¨ï¼Ž
        sidesã‚’sides[3]ã¨ã—ã¦ã‚‚良ã„ãŒåˆæœŸåŒ–ã®æ–¹æ³•ãŒé•ã†ã®ã§æ³¨æ„.ãã®å ´åˆï¼Œapple[i].sides = sides;ã¨ã™ã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ï¼Žé…列ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã‚³ãƒ”ーã§ãã¾ã›ã‚“ã§ã—ãŸã­ï¼Ž
    • 一番端ã®ãƒ‰ãƒŸãƒŽã«åŠ›ã‚’åŠ ãˆã¦è»¢å€’ã•ã›ã‚‹ï¼Žãƒ’ント ODE本101ページã«ã‚る力やトルクを加ãˆã‚‹ã«ã‚ã‚‹APIを使ã£ã¦ãã ã•ã„.
    • ドミノ倒ã—ã‚’é‘‘è³žã—æ¥½ã—ã‚€ï¼

Tags:

コメントをã©ã†ãž

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

1,378 views  (Since 2010-08-11)