9. ä½ç½®ã¨å§¿å‹¢

ODEåº§æ¨™ç³»ã€€ï¼ˆå³æ‰‹ç³»ï¼‰
ODE (Open Dynamics Engine) åˆç´šè¬›åº§ã®ç¬¬ï¼™å›žç›®ã§ã™ã€‚
今回ã¯ODEã®å˜ä½ç³»ä¸¦ã³ã«åº§æ¨™ç³»ã®ãŠè©±ã‚’ã—ã€å‰›ä½“ã®ä½ç½®ãƒ»å§¿å‹¢ã‚’è¨å®šåŠã³å–å¾—ã™ã‚‹æ–¹æ³•を説明ã—ã¾ã™ã€‚
å˜ä½ç³»
ODEã®å˜ä½ç³»ã¯åŸºæœ¬çš„ã«ä½•ã§ã‚‚ã‹ã¾ã„ã¾ã›ã‚“。ãŸã ã—ã€è§’度ã ã‘ã¯radianã«ãªã£ã¦ã„ã¾ã™ã€‚本講座ã§ã¯ä¸–界標準ã§ã‚ã‚‹SIå˜ä½ç³»ã‚’用ã„ã¾ã™ã€‚ ã“れã¯ç‰©ç†ãªã©ã§å¾¡ãªã˜ã¿ã®é•·ã•ã¯mã€è³ªé‡ã¯kgã€æ™‚é–“ã¯sã§ã™ã€‚
座標系
ODEã®åº§æ¨™ç³»ã¯ä¸Šå›³ã«ç¤ºã™ã‚ˆã†ã«ç‰©ç†ã‚„æ•°å¦ã§ä¸€èˆ¬çš„ã«ä½¿ã‚れã¦ã„ã‚‹å³æ‰‹ç³»ã®ç›´äº¤åº§æ¨™ã§ã™ã€‚原点ã¯ï¼™å€‹ã‚ã‚‹å°ã•ã„ピラミッドã®ä¸å¿ƒã§ã€ä¸å¿ƒã‹ã‚‰èµ¤ã„ピラミッド方å‘ãŒx軸ã€é’ã„ピラミッド方å‘ãŒy軸ã€ä¸Šç©ºæ–¹å‘ãŒz軸ã¨ãªã£ã¦ã„ã¾ã™ã€‚ãªãŠã€å˜ä½ç³»ã¯ä½•ã§ã‚‚よã„ã®ã§ã™ãŒã€ã“ã®è¬›åº§ã§ã¯ï¼³ï¼©å˜ä½ç³»ã‚’採用ã—ã¦ã„ã‚‹ã®ã§ã€å„ピラミッドã¯1mãšã¤ã®é–“éš”ã§ä¸¦ã‚“ã§ã„ã¾ã™ã€‚
ä½ç½®ã¨å§¿å‹¢ã®è¨å®š
剛体を3次元空間上ã«è¨å®šã™ã‚‹ãŸã‚ã«ã¯ã€ä½ç½®ã¨å§¿å‹¢ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚å§¿å‹¢ã¯å›žè»¢å¤‰æ›è¡Œåˆ—ã§æ±ºã‚ã‚‹ã“ã¨ãŒã§ãã€ODEã§ã‚‚以下ã®APIã«ã‚ˆã‚Šè¨å®šå¯èƒ½ã§ã™ã€‚
- void dBodySetPosition(dBodyID, dReal x, dReal y, dReal z);
剛体dBodyIDã®é‡å¿ƒã‚’絶対座標系ã®ä½ç½®(x, y, z)ã«è¨å®šã™ã‚‹ã€‚ - void dRFromAxisAndAngle(dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle);
回転軸ベクトル(ax, ay, az)ã®å›žã‚Šã‚’åæ™‚計方å‘ã«angle[rad]回転ã—ãŸã¨ãã®å›žè»¢å¤‰æ›è¡Œåˆ—Rã‚’å–å¾—ã™ã‚‹ã€‚ - void dBodySetRotation(dBodyID, const dMatrix3 R);
剛体dBodyIDã®å§¿å‹¢ã‚’回転行列Rã«è¨å®šã™ã‚‹ã€‚
ã¾ãŸã€ï¼¯ï¼¤ï¼¥ã§ã¯ã“ã®ã»ã‹ã«ã‚¯ã‚ªãƒ¼ã‚¿ãƒ‹ã‚ªãƒ³ã«é–¢ã™ã‚‹APIã€void dBodySetQuaternion (dBodyID, const dQuaternion q)ã‚‚ã‚りã¾ã™ã€‚
ä½ç½®ã¨å§¿å‹¢ã®å–å¾—
- const dReal * dBodyGetPosition(dBodyID);
剛体dBodyIDã®ä½ç½®ã‚’å–å¾—ã™ã‚‹ã€‚戻り値ã¯çµ¶å¯¾åº§æ¨™ç³»ã§ã®ä½ç½®ãŒæ ¼ç´ã•れã¦ã„ã‚‹é…列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - const dReal * dBodyGetRotation(dBodyID);
剛体dBodyIDã®å›žè»¢è¡Œåˆ—å–å¾—ã™ã‚‹ã€‚戻り値ã¯å›žè»¢è¡Œåˆ—ãŒæ ¼ç´ã•れã¦ã„ã‚‹é…列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚
サンプルコード
次ã®ã‚µãƒ³ãƒ—ルコードã¯å††æŸ±ã‚’ä½ç½®ï¼ˆ0.0, 0.0, 1.0)ã€ï½˜è»¸ã®ã¾ã‚りã«ï¼”5度(M_PI/4.0)回転ã—ãŸå§¿å‹¢ã«è¨å®šã—ã¦ã„ã¾ã™ã€‚ã•らã«ã€ç‰©ä½“ã®é‡å¿ƒä½ç½®ã‚’表示ã™ã‚‹é–¢æ•°printPos()ã‚‚è¿½åŠ ã—ã¾ã—ãŸã€‚ãªãŠã€å††æŸ±ã¯å§¿å‹¢ã‚’è¨å®šã—ãªã„ã¨é•·è»¸ãŒz軸方å‘ã¨ä¸€è‡´ã—ãŸç›´ç«‹ã®å§¿å‹¢ãŒåˆæœŸå€¤ã¨ãªã£ã¦ã„ã¾ã™ã€‚
typedef struct {
dBodyID body;
dGeomID geom;
} MyObject;
MyObject pillar;
void createPillar()
{
dMass m1;
dReal radius = 0.1, length = 0.5, mass = 1.0; // åŠå¾„ã€é•·ã•ã€è³ªé‡
pillar.body = dBodyCreate(world);
dMassSetZero(&m1);
dMassSetCylinderTotal(&m1,mass,3,radius,length);
dBodySetMass(pillar.body,&m1);
dBodySetPosition(pillar.body,0.0,0.0,1.0); // (0.0,0.0,1.0)[m]ã«é‡å¿ƒã‚’è¨å®š
dMatrix3 R;
dRFromAxisAndAngle(R,1.0,0.0,0.0, M_PI/4.0); //x軸周りã«Ï€/4[rad]回転
dBodySetRotation(pillar.body,R);
pillar.geom = dCreateCylinder(space,radius,length);
dGeomSetBody(pillar.geom,pillar.body);
}
void printPos(dBodyID obj_body) // é‡å¿ƒä½ç½®ã®è¡¨ç¤º
{
const dReal *pos;  // constを忘れるã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹
dReal x, y, z;
pos = dBodyGetPosition(obj_body); // 戻り値ã¯é…列ã¸ã®const ãƒã‚¤ãƒ³ã‚¿
x = pos[0]; // é…列posã«ã¯x, y, zã®é †ç•ªã§åº§æ¨™å€¤ãŒæ ¼ç´ã•れã¦ã„ã‚‹
y = pos[1];
z = pos[2];
printf("x=%f y=%f z=%f \n", x, y, z);
}
ãªãŠã€ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ sample9-081009.zipã¯ã“ã“ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã§ãã¾ã™ã€‚ ã¾ãŸæ¬¡å›žï¼
ç§ã¯ã€ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«è¡¨ç¤ºã™ã‚‹printPos()を使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ï¼
返信ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
dsDrawSphere()ã®äº‹ã§ã™ãŒã€ãれã£ã¦107行目ã®dsDrawSphere(dGeomGetPosition(gID),dGeomGetRotation(gID),dGeomSphereGetRadius(gID));ã®ã“ã¨ã§ã™ã‚ˆã。
case内ã«ã‚‚ã†ã²ã¨ã¤å…¥åŠ›ã—ã¦ã¿ãŸã®ã§ã™ãŒã‚„ã¯ã‚Šãƒœãƒ¼ãƒ«ãŒå¢—ãˆã¾ã›ã‚“。
è¿½åŠ ãƒœãƒ¼ãƒ«ã®é–¢æ•°ã¯ã‚µãƒ³ãƒ—ル内ã«ã‚ã£ãŸãƒœãƒ¼ãƒ«ã®é–¢æ•°ã®ç›´å¾Œã«å…¥åŠ›ã—ã¾ã—ãŸãŒã€å…¥ã‚Œæ–¹ãŒé•ã†ã‚“ã§ã—ょã†ã‹ï¼Ÿ
ã“ã‚“ã«ã¡ã¯ã€‚
ã“ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ãŸã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã‚’å…ƒã«è¡¨ç¤ºã•れるçƒä½“を増やãã†ã¨ã—ã¦ã„ã¾ã™ãŒã€ãƒœãƒ¼ãƒ«ãŒå¢—ãˆãšã€è¿½åŠ ã—ãŸãƒœãƒ¼ãƒ«ã—ã‹è¡¨ç¤ºã•れã¾ã›ã‚“。ã©ã†ãªã£ã¦ã„ã‚‹ã‚“ã§ã—ょã†ã‹ï¼Ÿ
カノッサã•ん,
ã”迷惑をãŠã‹ã‘ã—ã¦ã™ã¿ã¾ã›ã‚“ãŒï¼Œã“ã®æƒ…å ±é‡ã ã‘ã§ã¯ç§ã«ã‚‚ã©ã†ãªã£ã¦ã„ã‚‹ã‹ã‚ã‹ã‚Šã¾ã›ã‚“.
ã§ã‚€
返信ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
サンプルプãƒã‚°ãƒ©ãƒ ã«ãƒœãƒ¼ãƒ«ã‚’ã•らã«è¡¨ç¤ºã•ã›ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ ã‚’è¿½åŠ ã—ãŸã®ã§ã™ãŒã€ï½¢è˜åˆ¥åãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï½£ã¨ã„ã†ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã®ã§ã™ã€‚ãã—ã¦ã€ãã“ã‚’ä¿®æ£ã™ã‚‹ã¨è¿½åŠ ã—ãŸæ–¹ã®ãƒœãƒ¼ãƒ«ã¯è¡¨ç¤ºã•れるã®ã§ã™ãŒã€ã‚‚ã¨ã‚‚ã¨ã‚µãƒ³ãƒ—ル内ã«ã‚ã£ãŸãƒœãƒ¼ãƒ«ãŒè¡¨ç¤ºã•れãªããªã£ã¦ã—ã¾ã†ã®ã§ã™ã€‚
個人的ã«ã¯ãƒœãƒ¼ãƒ«ã‚’二ã¤è¡¨ç¤ºã•ã›ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を作りãŸã„ã®ã§ã™ãŒãƒ»ãƒ»ãƒ»
カノッサã•ã‚“ã€
大変é…ããªã‚Šã™ã¿ã¾ã›ã‚“。
外ã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€ãƒœãƒ¼ãƒ«ã‚’2個表示ã•ã›ã‚‹ãŸã‚ã«ã¯ã€dsDrawSphere()を2回呼ã³å‡ºã•ãªã‘れã°ã„ã‘ã¾ã›ã‚“。
ã•れã¦ã„ã¾ã™ã‹ï¼Ÿ
ã§ã‚€