ODE講座6補講:è¡çªæ¤œå‡º

2008-01-25
By


ODE講座6ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã§ã¯åœ°é¢ã¨çƒã¨ã®æŽ¥è§¦ã‚’判定ã™ã‚‹å¤‰æ•°ã‚’グローãƒãƒ«å¤‰æ•°ã¨ã—ã¦ã„ã¾ã—ãŸã€‚授業ã§ã¯ã‚°ãƒ­ãƒ¼ãƒãƒ«å¤‰æ•°ã®ä½¿ç”¨ã‚’é¿ã‘るよã†ã«èª¬æ˜Žã—ã¦ã„ã‚‹ã®ã§ã€ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’ãƒ­ãƒ¼ã‚«ãƒ«å¤‰æ•°ã«æ”¹ã‚ã¾ã—ょã†ã€‚今年度ã‹ã‚‰ãƒ—ログラミングã®è¬›ç¾©ã«ODEを使ã„ã€å­¦ç”Ÿã®ãƒ¢ãƒãƒ™ãƒ¼ã‚·ãƒ§ãƒ³ã¨ãƒ—ログラミングスキルを高ã‚ã‚‹ã¨ã„ã†è©¦ã¿ã‚’ã—ã¦ã„ã‚‹ã®ã§ã€ä»Šå›žã®è£œè¬›ã¯ãã®ä¸€ç’°ã§ã™ã€‚

ãƒã‚¤ãƒ³ãƒˆã¯dSpaceCollide(dSpaceID space, void *data, dNearCallback *callback);ãŒcallback関数ã«å¼•æ•°dataを渡ã™ã“ã¨ãŒã§ãã‚‹ã®ã§ã€ãã®dataã¨ã—ã¦è¡çªåˆ¤å®šã®å¤‰æ•°ã‚’渡ã™ã“ã¨ã§ã™ã€‚ãªãŠã€dataã¯voidã¸ã®ãƒã‚¤ãƒ³ã‚¿ã«ãªã£ã¦ã„ã¾ã™ã€‚void ï¼Šã¯æ±Žç”¨ãƒã‚¤ãƒ³ã‚¿ã¨å‘¼ã°ã‚Œã‚‹ã‚‚ã®ã§ã€é–¢æ•°ã®å¼•æ•°ã¨ã—ã¦è‰²ã€…ãªåž‹ã‚’å–ã‚‹ã“ã¨ãŒã§ãã‚‹ä¸‡èƒ½é¸æ‰‹ã§ã™ã€‚

注æ„ã™ã‚‹ç‚¹ã¨ã—ã¦ã¯ã€æ¬¡ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ï¼”行目ã®ã‚ˆã†ã«ä½¿ã„ãŸã„åž‹ã«ã‚­ãƒ£ã‚¹ãƒˆã™ã‚‹ã“ã¨ã§ã™ã€‚


[code]
//  è¡çªæ¤œå‡ºã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°
static void nearCallback(void *data, dGeomID o1, dGeomID o2)
{
int *flag = (int *) data; // 汎用ãƒã‚¤ãƒ³ã‚¿ã¯ä½¿ã„ãŸã„åž‹ã«ã‚­ãƒ£ã‚¹ãƒˆãŒå¿…è¦
static const int N = 4;    // 接触点数ã®ä¸Šé™ã¯4個 staticを忘れãšã«ã¤ã‘ã¦ãã ã•ã„.

dContact contact[N];

int isGround = ((ground == o1) || (ground == o2)); // è¡çªã™ã‚‹ï¼’ã¤ã®ã†ã¡ã©ã¡ã‚‰ã‹ãŒåœ°é¢ãªã‚‰isGroundã®ãƒ•ラグを立ã¦ã‚‹
int n = dCollide(o1,o2,N,&contact[0].geom,sizeof(dContact)); // nã¯è¡çªç‚¹æ•°

if (isGround) { // è¡çªã™ã‚‹å¯èƒ½æ€§ã®ã‚るジオメトリã®ã©ã¡ã‚‰ã‹ãŒåœ°é¢ãªã‚‰
if (n >= 1) *flag = 1; // 変更ã—ãŸéƒ¨åˆ†
else *flag = 0; // 変更ã—ãŸéƒ¨åˆ†
for (int i = 0; i < n; i++) {
contact[i].surface.mode = dContactBounce; // 地é¢ã®å発係数を設定
contact[i].surface.bounce = 0.0; // (0.0~1.0) å発係数ã¯0ã‹ã‚‰1ã¾ã§
contact[i].surface.bounce_vel = 0.0; // (0.0以上) å発ã«å¿…è¦ãªæœ€ä½Žé€Ÿåº¦

// コンタクトジョイント生æˆ
dJointID c = dJointCreateContact(world,contactgroup,&contact[i]);
// 接触ã—ã¦ã„ã‚‹ï¼’ã¤ã®geometryã‚’ã‚³ãƒ³ã‚¿ã‚¯ãƒˆã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã§æ‹˜æŸ
dJointAttach (c,dGeomGetBody(contact[i].geom.g1),
dGeomGetBody(contact[i].geom.g2));
}
}
}

static void simLoop (int pause)
{
const dReal *pos,*R;
int flag = 0; // 地é¢ã¨ã®è¡çªflagã‚’ï¼ã«ã‚»ãƒƒãƒˆ

// è¡çªåˆ¤å®šã€flagã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒnearCallback関数ã«å¼•æ•°ã¨ã—ã¦æ¸¡ã•れる。
// ã“ã®ä¾‹ã§ã¯åœ°é¢ã¨è¡çªã™ã‚‹ã¨flagã«ï¼‘ã€è¡çªã—ãªã„å ´åˆã¯ï¼ãŒå…¥ã‚‹ã€‚
dSpaceCollide(space, &flag,&nearCallback);

dWorldStep(world,0.01);      // シミュレーションを1ステップ進ã‚ã‚‹
dJointGroupEmpty(contactgroup); // ジョイントグループを空ã«ã™ã‚‹

if (flag == 0) dsSetColor(1.0, 0.0, 0.0);  // 赤色ã®è¨­å®š
else dsSetColor(0.0, 0.0, 1.0); // é’色ã®è¨­å®š
pos = dBodyGetPosition(ball.body);  // ä½ç½®
R = dBodyGetRotation(ball.body);  // 回転行列
dsDrawSphere(pos,R,radius);    // çƒã®æç”»
}
[/code]

今回ã¯ã“ã®è¾ºã§â€¦

コメントをã©ã†ãž

メールアドレスãŒå…¬é–‹ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。

758 views  (Since 2010-08-11)