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ã®é€Ÿåº¦ã‚’å–å¾—ã—ã¾ã™ã€‚戻り値ã¯è¦ç´ 数3個ã®é…列を指ã™ã‚³ãƒ³ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚
- const dReal *dBodyGetAngularVel(dBodyID body);
bodyã®è§’速度をå–å¾—ã—ã¾ã™ã€‚戻り値ã¯è¦ç´ 数3個ã®é…列を指ã™ã‚³ãƒ³ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚
ï¼’ï¼ŽåŠ é€Ÿåº¦ã€è§’åŠ é€Ÿåº¦
残念ãªãŒã‚‰ODEã¯åŠ é€Ÿåº¦ã€è§’åŠ é€Ÿåº¦ã‚’å–å¾—ã™ã‚‹APIã¯ã‚りã¾ã›ã‚“。速度変化ã€ã‚ã‚‹ã„ã¯è§’速度変化を時間ステップサイズã§å‰²ã£ã¦ãれらを求ã‚ã¦ãã ã•ã„。時間ステップã¨ã¯dWorldStep(dWorldID, dReal stepsize)ã®ï¼’番目ã®å¼•æ•°stepsizeã€æ•°å€¤ç©åˆ†ã®æ™‚間ステップサイズã®ã“ã¨ã§ã™ã€‚
注æ„ã™ã‚‹ç‚¹ã¨ã—ã¦ã¯ã€dBodyGetLinearVel(), dBodyGetAngularVel()ã®æˆ»ã‚Šå€¤ãŒè¦ç´ 数3個ã®é…列を指ã™ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ã¤ã¾ã‚Šã€æˆ»ã‚Šå€¤ãŒã‚¹ã‚«ãƒ©ã§ã¯ãªã絶対座標系(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);
}
ã“ã“ã‹ã‚‰ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ をダウンãƒãƒ¼ãƒ‰ã§ãã¾ã™ã€‚ ãŠã—ã¾ã„。

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