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

新年明ã‘ã¾ã—ã¦ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ã€‚
ゲーム開発やãƒãƒœãƒƒãƒˆã®ç ”究者ã«ã‚‚使ã‚れã¦ã„るオープンソースã®ç‰©ç†è¨ˆç®—エンジンODE(Open Dynamics Engineã€ã‚ªãƒ¼ãƒ—ン ダイナミクスエンジン)をå¦ã¶ODE講座ã®ç¬¬ï¼‘4回目ã§ã™ã€‚
ã”質å•ã®ä¸ã§ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒ†ã‚£ãƒ–ã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ã—ãŸã„ã¨ã„ã†è¦æœ›ãŒå¤šã‹ã£ãŸã®ã§ã€ä»Šå›žã¯ãã®æ–¹æ³•ã‚’å¦ã³ã¾ã™ã€‚ODEã§ã¯ï¼Œã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ä¸ã«ã‚ーボードã‹ã‚‰ã®å…¥åŠ›ã‚’å—付ã‘ã¾ã™ã®ã§ï¼Œå…¥åŠ›ã™ã‚‹ã‚ーã«å¯¾å¿œã™ã‚‹é–¢æ•°ãªã©ã‚’作æˆã™ã‚‹ã¨ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒ†ã‚£ãƒ–ãªã‚·ãƒŸãƒ¥ レーションãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ï¼Žï¼¯ï¼¤ï¼¥ã‚‚ブãƒã‚°ã‚‚インタラクティブãªã¨ã“ã‚ãŒé…力ã®ä¸€ã¤ã§ã™ã.
以下ã«é‡è¦ãªéƒ¨åˆ†ã ã‘ソースコードを示ã—ã¾ã™ï¼Žã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¯sample2を変更ã—,ボールã®ä»–ã«å††æŸ±ã‚ªãƒ–ジェクトを表示ã—ã¦ï¼Œã‚ーボードã‹ã‚‰ã®å…¥åŠ›ã«ã‚ˆã‚Šå¤–åŠ›ã‚’åŠ ãˆãŸã‚Šï¼Œã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®å†ã‚¹ã‚¿ãƒ¼ãƒˆã‚’å¯èƒ½ã¨ã—ã¦ã„ã¾ã™ï¼Ž
[code]
/*** æç”»ã®æº–備 ***/
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; // sã‚ãƒ¼ãŒæŠ¼ã•れãŸã‚‰ã¨ãã®å‡¦ç†
case ‘j’: dBodyAddForce(ball.body ,0,-10, 0);break; // jã‚ãƒ¼ãŒæŠ¼ã•れãŸã‚‰ã¨ãã®å‡¦ç†
case ‘k’: dBodyAddForce(ball.body ,0, 0,50);break; // kã‚ãƒ¼ãŒæŠ¼ã•れãŸã‚‰ã¨ãã®å‡¦ç†
case ‘l’: dBodyAddForce(ball.body ,0, 10, 0);break; // lã‚ãƒ¼ãŒæŠ¼ã•れãŸã‚‰ã¨ãã®å‡¦ç†
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);
}
[/code]
command関数ã¯ã‚ーボードã‹ã‚‰ã®å…¥åŠ›ã‚’å‡¦ç†ã™ã‚‹é–¢æ•°ã§ã™ã€‚caseã®å³ã«ã‚ã‚‹’r'ãªã©ã®æ–‡å—ã¯ã‚ãƒ¼ãƒœãƒ¼ãƒ‰ãŒæŠ¼ã•ã‚ŒãŸæ–‡å—ã«å¯¾å¿œã—ã¾ã™ã€‚ã“ã®éƒ¨åˆ†ã«å¿…è¦ãªå‡¦ç†ã‚’書ã‘ã°ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒ†ã‚£ãƒ–ãªã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’作るã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã“ã“ã§ã¯ã€’r'ã‚ãƒ¼ãŒæŠ¼ã•れるã¨restart関数ãŒã‚ˆã°ã‚Œã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒå†ã‚¹ã‚¿ãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚
ãªãŠã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ã“ã“ã«ã‚りã¾ã™ã®ã§ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—ã¦ãã ã•ã„.
ã‚ーボードã®s, j ,k, lã‚ーを押ã™ã¨å††æŸ±ã‚„ボールã«å¤–力ãŒåƒã,rã‚ーを押ã™ã¨ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒãƒªã‚¹ã‚¿ãƒ¼ãƒˆã—,コントãƒãƒ¼ãƒ«ã‚ーを押ã—ãªãŒã‚‰pã‚ーを押ã™ã¨ä¸€æ™‚åœæ¢ã—ã¾ã™ï¼ŽãŠè©¦ã—ã‚れ.