10. 速度ã¨åŠ é€Ÿåº¦

ODE (Open Dynamics Engine) åˆç´šè¬›åº§ã®ç¬¬ï¼‘ï¼å›žç›®ã§ã™ã€‚

今回ã¯ã€é€Ÿåº¦ã€è§’速度ã€åŠ é€Ÿåº¦ã€è§’加速度ã«ã¤ã„ã¦å­¦ã³ã¾ã™ã€‚

1.速度ã€è§’速度

剛体ã®é€Ÿåº¦ã®è¨­å®šã¯dBodySetLinearVel()ã€è§’速度ã®è¨­å®šã¯dBodySetAngularVel()ã€ã‚’使ã„ã¾ã™ã€‚ãŸã ã—ã€ã“ã®é€Ÿåº¦ã¯é‡å¿ƒã®é€Ÿåº¦ã€è§’速度ã¯é‡å¿ƒå‘¨ã‚Šã®è§’速度ã§ã™ã€‚ã¾ãŸã€ãƒœãƒ‡ã‚£ã®é€Ÿåº¦ã‚’設定ã™ã‚‹ã“ã¨ã¯åˆæœŸçŠ¶æ…‹ã ã‘ã«ã—ã€æ™‚間ステップ毎ã«å¼·åˆ¶çš„ã«ã‚る速度を設定ã™ã‚‹ã“ã¨ã¯ã€å®Ÿéš›ã®ç‰©ç†ç¾è±¡ã¨ã¯ç•°ãªã£ãŸæŒ™å‹•を生ã¿å‡ºã—ã¦ã—ã¾ã„ã¾ã™ã®ã§é¿ã‘ã¦ãã ã•ã„。

ã‚‚ã—ã€ç‰©ä½“ã®é€Ÿåº¦ã‚’コントロールã—ãŸå ´åˆã¯ã€é–¢ç¯€ã«ä»˜å±žã—ã¦ã„るモータを使ã£ã¦ãã ã•ã„。

  • void dBodySetLinearVel(dBodyID body, dReal x, dReal y, dReal z);
    bodyã®é€Ÿåº¦ã‚’絶対座標系ã§(x, y, z) [m/s]ã«è¨­å®šã—ã¾ã™ã€‚
  • void dBodySetAngularVel(dBodyID body, dReal x, dReal y, dReal z);
    bodyã®è§’速度を絶対座標系ã®å„軸周りã«(x, y, z) [rad/s]ã¨è¨­å®šã—ã¾ã™ã€‚
  • const dReal *dBodyGetLinearVel(dBodyID body);
    bodyã®é€Ÿåº¦ã‚’å–å¾—ã—ã¾ã™ã€‚戻り値ã¯è¦ç´ æ•°ï¼“個ã®é…列を指ã™ã‚³ãƒ³ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚
  • const dReal *dBodyGetAngularVel(dBodyID body);
    bodyã®è§’速度をå–å¾—ã—ã¾ã™ã€‚戻り値ã¯è¦ç´ æ•°ï¼“個ã®é…列を指ã™ã‚³ãƒ³ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚


2.加速度ã€è§’加速度

残念ãªãŒã‚‰ODEã¯åŠ é€Ÿåº¦ã€è§’加速度をå–å¾—ã™ã‚‹APIã¯ã‚りã¾ã›ã‚“。速度変化ã€ã‚ã‚‹ã„ã¯è§’速度変化を時間ステップサイズã§å‰²ã£ã¦ãれらを求ã‚ã¦ãã ã•ã„。時間ステップã¨ã¯dWorldStep(dWorldID, dReal stepsize)ã®ï¼’番目ã®å¼•æ•°stepsizeã€æ•°å€¤ç©åˆ†ã®æ™‚間ステップサイズã®ã“ã¨ã§ã™ã€‚

注æ„ã™ã‚‹ç‚¹ã¨ã—ã¦ã¯ã€dBodyGetLinearVel(), dBodyGetAngularVel()ã®æˆ»ã‚Šå€¤ãŒè¦ç´ æ•°ï¼“個ã®é…列を指ã™ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ã¤ã¾ã‚Šã€æˆ»ã‚Šå€¤ãŒã‚¹ã‚«ãƒ©ã§ã¯ãªã絶対座標系(x, y, z軸)ã®ï¼“次元ベクトルã§ã™ã€‚角速度ã¯å„軸周りã§ã™ã€‚

3.サンプルプログラム

サンプルプログラムã¯ç¬¬ï¼™å›žç›®ã®ã‚µãƒ³ãƒ—ルプログラムsample9.cppã«çƒã®é€Ÿåº¦ã€åŠ é€Ÿåº¦ä¸¦ã³ã«å††æŸ±ã®é€Ÿåº¦ã€åŠ é€Ÿåº¦è¡¨ç¤ºã‚’è¿½åŠ ã™ã‚‹ã ã‘ã®ç°¡å˜ãªãƒ—ログラムã§ã™ã€‚

static void simLoop (int pause)
{
  static long steps = 0;
  const dReal stepsize = 0.01;    
  const dReal *linear_vel, *angular_vel;
  static dReal linear_vel_old[3], angular_vel_old[3];
  dReal linear_accel[3], angular_accel[3];

  if (!pause)  {
    dSpaceCollide(space,0,&nearCallback);
    dWorldStep(world,stepsize);
    dJointGroupEmpty(contactgroup);
  }

  // 速度(Linear velocity),  角速度(Angular Velocity)
  linear_vel  = dBodyGetLinearVel(ball.body);
  angular_vel = dBodyGetAngularVel(pillar.body);
  printf("\n%d steps \n", steps++);
  printf("Linear Velocity: x=%.3f y=%.3f z=%.3f \n", linear_vel[0],linear_vel[1],linear_vel[2]);
  printf("Angular Velocity: x=%.3f y=%.3f z=%.3f \n",       angular_vel[0],angular_vel[1],angular_vel[2]);

  // 加速度(Linear acceleration), 角加速度(Angular acceleration)
  for (int i=0; i < 3; i++) {
    linear_accel[i] = (linear_vel[i]-linear_vel_old[i])  /stepsize;
    angular_accel[i] = (angular_vel[i]-angular_vel_old[i])/stepsize;
  }

  printf("Linear Acceleration: x=%.3f y=%.3f z=%.3f \n",       linear_accel[0],linear_accel[1],linear_accel[2]);
  printf("Angular Acceleration: x=%.3f y=%.3f z=%.3f \n",       angular_accel[0],angular_accel[1],angular_accel[2]);

  for (int j=0; j < 3; j++) {
    linear_vel_old[j]  = linear_vel[j];
    angular_vel_old[j] = angular_vel[j];
  }

  drawObject(ball.geom,1.3,0,0);
  drawObject(pillar.geom,0,0,1.3);
}

ã“ã“ã‹ã‚‰ã‚µãƒ³ãƒ—ルプログラムをダウンロードã§ãã¾ã™ã€‚ ãŠã—ã¾ã„。

One Response to 10. 速度ã¨åŠ é€Ÿåº¦

  1. hiro MonsterID Icon hiro on 2009-11-16

    ã¯ã˜ã‚ã¾ã—ã¦ï¼ŒODEåˆå¿ƒè€…ã§ã„ã¤ã‚‚サイトをå‚考ã«ã•ã›ã¦ã„ãŸã ã„ã¦ã‚‹è€…ã§ã™ï¼Žã„ããªã‚Šã§ç”³ã—訳ã‚りã¾ã›ã‚“.質å•ãŒã‚ã‚‹ã®ã§ã™ãŒï¼Œã‚¸ã‚ªãƒ¡ãƒˆãƒªã®é€Ÿåº¦ã‚’設定ã—ãŸã„ã®ã§ã™ãŒæ–¹æ³•ãŒåˆ†ã‹ã‚Šã¾ã›ã‚“,何ã‹ã‚ˆã„方法ã¯ã‚りã¾ã›ã‚“ã‹ï¼ŸãŠé¡˜ã„ã—ã¾ã™ï¼Ž

コメントをã©ã†ãž

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

3,860 views