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

å‰å›žè³ªå•を募集ã—ãŸã¨ã“ã‚,貴é‡ãªè³ªå•ã‚’é ‚ãã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ï¼Žåˆå¿ƒè€…用ã®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ã‚ーを押ã™ã¨ä¸€æ™‚åœæ¢ã—ã¾ã™ï¼ŽãŠè©¦ã—ã‚れ.
æœ€è¿‘ã¯æ”¿æ²»ã®ä¸–界ã§ã‚‚(党è°ï¼‰æ‹˜æŸãŒã‹ã‹ã‚‹ã‚ˆã†ãªã®ã§ï¼Œæ¬¡å›žã¯æ‹˜æŸã«ã¤ã„ã¦ãŠè©±ã—ãŸã„ã¨æ€ã„ã¾ã™ï¼Ž