15. ã‚ーボードæ“作ã¨å†å®Ÿè¡Œ

ODE (Open Dynamics Engine) åˆç´šè¬›åº§ã®ç¬¬ï¼‘5回目ã§ã™ã€‚
今回ã¯ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒ†ã‚£ãƒ–ã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ã™ã‚‹æ–¹æ³•ã‚’å¦ã³ã¾ã™ã€‚ODEã§ã¯ï¼Œã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ä¸ã«ã‚ーボードã‹ã‚‰ã®å…¥åŠ›ã‚’å—付ã‘ã¾ã™ã®ã§ï¼Œå…¥åŠ›ã™ã‚‹ã‚ーã«å¯¾å¿œã™ã‚‹é–¢æ•°ãªã©ã‚’作æˆã™ã‚‹ã¨ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒ†ã‚£ãƒ–ãªã‚·ãƒŸãƒ¥ レーションãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ï¼Žï¼¯ï¼¤ï¼¥ã‚‚ブãƒã‚°ã‚‚インタラクティブãªã¨ã“ã‚ãŒé…力ã®ä¸€ã¤ã§ã™ã.
ã‚ーボードæ“作
以下ã«é‡è¦ãªéƒ¨åˆ†ã ã‘ソースコードを示ã—ã¾ã™ï¼Žã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¯sample9を変更ã—,ボールã®ä»–ã«å††æŸ±ã‚ªãƒ–ジェクトを表示ã—ã¦ï¼Œã‚ーボードã‹ã‚‰ã®å…¥åŠ›ã«ã‚ˆã‚Šå¤–åŠ›ã‚’åŠ ãˆãŸã‚Šï¼Œã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®å†ã‚¹ã‚¿ãƒ¼ãƒˆã‚’å¯èƒ½ã¨ã—ã¦ã„ã¾ã™ï¼Ž
/*** æç”»ã®æº–備 ***/
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);
}
command関数ã¯ã‚ーボードã‹ã‚‰ã®å…¥åŠ›ã‚’å‡¦ç†ã™ã‚‹é–¢æ•°ã§ã™ã€‚caseã®å³ã«ã‚ã‚‹’r'ãªã©ã®æ–‡å—ã¯ã‚ãƒ¼ãƒœãƒ¼ãƒ‰ãŒæŠ¼ã•ã‚ŒãŸæ–‡å—ã«å¯¾å¿œã—ã¾ã™ã€‚ã“ã®éƒ¨åˆ†ã«å¿…è¦ãªå‡¦ç†ã‚’書ã‘ã°ã‚¤ãƒ³ã‚¿ãƒ©ã‚¯ãƒ†ã‚£ãƒ–ãªã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’作るã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã‚ーボードã®s, j ,k, lã‚ーを押ã™ã¨å††æŸ±ã‚„ボールã«å¤–力ãŒåƒã,rã‚ーを押ã™ã¨ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒãƒªã‚¹ã‚¿ãƒ¼ãƒˆã—,コントãƒãƒ¼ãƒ«ã‚ーを押ã—ãªãŒã‚‰pã‚ーを押ã™ã¨ä¸€æ™‚åœæ¢ã—ã¾ã™ï¼Ž
å†å®Ÿè¡Œ
ã“ã“ã§ã¯ã€’r'ã‚ãƒ¼ãŒæŠ¼ã•れるã¨restart関数ãŒã‚ˆã°ã‚Œã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒå†å®Ÿè¡Œã—ã¾ã™ã€‚ãªãŠã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†å®Ÿè¡Œã™ã‚‹å ´åˆã¯æœ€ä½Žä»¥ä¸‹ã®å‡¦ç†ã‚’実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚サンプルプãƒã‚°ãƒ©ãƒ ã§ã¯ç°¡å˜ã«ã™ã‚‹ãŸã‚ã€ãƒœãƒ‡ã‚£ã¨ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’ç ´å£Šã—ã€å†ç”Ÿã—ã¦ã„ã¾ã™ã€‚
- 接触ジョイント(contact joints)ã®å‰Šé™¤
- å„ボディã®ä½ç½®ã¨å§¿å‹¢ã‚’リセットã™ã‚‹ã€‚
- å„ボディã®é€Ÿåº¦ã¨è§’速度をリセットã™ã‚‹ã€‚
- ジョイントを制御ã—ã¦ã„ã‚‹å ´åˆã€ç›®æ¨™é€Ÿåº¦ã¨æœ€å¤§ç™ºæ®ãƒˆãƒ«ã‚¯ã‚’リセットã™ã‚‹ã€‚
ãªãŠã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰sample15ã¯ã“ã“ã«ã‚りã¾ã™ã®ã§ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—ã¦ãã ã•ã„.
ã“ã‚“ã«ã¡ã¯ã€‚今回ODEã®å‹‰å¼·ã‚’ã—ã¦ã„ã‚‹starã¨ã„ã„ã¾ã™ã€‚
çªç„¶ã§ã™ãŒã“ã®ãƒšãƒ¼ã‚¸ã§ã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã¯ãƒœãƒ¼ãƒ«ã‚„円柱を手動ã§å‹•ã‹ã—ã¦ã„ã¾ã™ã‚ˆã。
æ€ã£ãŸã‚“ã§ã™ãŒã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿å†…ã®å‰›ä½“ã‚’é‡åЛ以外ã§è‡ªå‹•ã§å‹•ã‹ã™ã“ã¨ã¯ã§ãã‚‹ã‚“ã§ã™ã‹ï¼Ÿ
例ãˆã°ã€ãƒœãƒ¼ãƒ«ã‚’å·¦å³ã«ç§»å‹•ã—ç¶šã‘ã‚‹ã¨ã„ã†å‹•作ãŒã§ãã‚‹ã¨è‰²ã€…ã¨é¢ç™½ã„ã¨ãŠã‚‚ã†ã‚“ã§ã™ã‘ã©ã€‚
starã•ん,
ã“ã‚“ã«ã¡ã¯ï¼Ž
ã§ãã¾ã™ï¼Ž
剛体ã«åŠ›ã‚„ãƒˆãƒ«ã‚¯ã‚’åŠ ãˆã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã§ï¼Œã‚¢ã‚¤ãƒ‡ã‚£ã‚¢æ¬¡ç¬¬ã§ã„ã‚ã„ã‚ã¨é¢ç™½ã„ã“ã¨ãŒã§ãã¾ã™ï¼Ž
ç§ã®è¬›ç¾©ã§ã¯ï¼Œï¼¯ï¼¤ï¼¥ã‚’使ã„ゲームを作る課題を出ã—ã¦ã„ã¾ã™ï¼Ž
ã§ã‚€
返信ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
ã‚れã‹ã‚‰è‰²ã€…ã¨èª¿ã¹ã¦ã¿ãŸã®ã§ã™ãŒå‰›ä½“をプãƒã‚°ãƒ©ãƒ ã§è‡ªå‹•æ“作ã™ã‚‹æ–¹æ³•ãŒã©ã†ã—ã¦ã‚‚分ã‹ã‚Šã¾ã›ã‚“。
å¤±ç¤¼ã‚’æ‰¿çŸ¥ã§æ–¹æ³•ã«ã¤ã„ã¦æ•™ãˆã¦ã„ãŸã ã‘ãªã„ã§ã—ょã†ã‹ï¼Ÿ
Thanks for the tutorials!
Thank you for your comments. I am not sure that you can read Japanese, however, you can read the English page of this article.
http://demura.net/english/ode15
Cheers!