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