ODE講座27: é–¢ç¯€åˆæœŸè§’度ã®è¨å®šæ³•

2関節ãƒãƒœãƒƒãƒˆã‚¢ãƒ¼ãƒ .1番目ã®é–¢ç¯€åˆæœŸè§’度を15度,2番目ã®é–¢ç¯€åˆæœŸè§’度を30度ã«è¨å®šï¼Ž
ãŒãーã•ã‚“ã‹ã‚‰ä»¥ä¸‹ã®ã”質å•ãŒã‚りã¾ã—ãŸï¼Žã€Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è§’度ã®åˆæœŸè¨å®šã‚’行ã„ãŸã„ã¨ã(例ãˆã°Hinge Jointã‚’Ï€/4ã ã‘æ›²ã’ã‚‹ã¨ã‹)ã€ã©ã®ã‚ˆã†ã«è¨å®šã™ã‚Œã°è‰¯ã„ã®ã§ã—ょã†ã‹?トルクãŒã‹ã‹ã‚‰ãªã„状態ã§åˆæœŸè¨å®šã‚’行ã„ã€ãã®çŠ¶æ…‹ã‹ã‚‰ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å§‹ã‚ãŸã„ã®ã§ã™ãŒã€‚。。ヒントãŒã‚れã°ã‚ˆã‚ã—ããŠé¡˜ã„致ã—ã¾ã™ï¼Žã€
ã“れã«ã€Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®åˆæœŸè§’度ã¯ï¼Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã‚’生æˆã—ãŸæ™‚ãŒï¼[rad]ã«ãªã‚Šã¾ã™ï¼Žä¾‹ãˆã°ï¼Œï¼’ã¤ã®ãƒªãƒ³ã‚¯ã®æˆã™è§’度π/4ã‚’åˆæœŸè§’度ã¨ã—ãŸã„å ´åˆã¯ï¼Œç‰‡æ–¹ã®ãƒªãƒ³ã‚¯ã‚’Ï€/4回転ã•ã›ãŸå¾Œã§ï¼Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã§ï¼’ã¤ã®ãƒªãƒ³ã‚¯ã‚’çµåˆã—ã¾ã™ï¼Žã€ã¨å›žç”ã—ã¾ã—ãŸï¼Ž
ãれã‹ã‚‰ã¾ãŸï¼ŒãŒãーã•ã‚“ãŒã€ŒdJointSetHingeAngleãŒã‚れã°ä¾¿åˆ©ãªã®ã«ï¼Žï¼Žï¼Žã€ã¨ã„ã†æ›¸ãè¾¼ã¿ãŒã‚り,googleã§dJointSetHingeAngle検索ã—ãŸã‚‰ï¼Œãƒã‚·ã‚¢èªžã§ã™ãŒé–¢é€£ã™ã‚‹ä»¥ä¸‹ã®ãƒšãƒ¼ã‚¸ã‚’見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã—ãŸï¼Žhttp://www.gamedev.ru/code/forum/?id=19481ãã®ä¸ã§ShurikParã•ã‚“ãŒï¼Œä»¥ä¸‹ã®ã‚ˆã†ã«ã™ã‚Œã°é–¢ç¯€ã‚’固定ã§ãã‚‹ã¨ã„ã†ã‚³ãƒ¡ãƒ³ãƒˆãŒã‚り,ãれをヒントã«åˆæœŸè§’度をè¨å®šã™ã‚‹ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ を作りã¾ã—ãŸï¼Ž
- dJointSetHingeParam (Joint, dParamLoStop, angle – 0.001f);
- dJoitSetHingeParam (Joint, dParamHiStop, angle);
ã¨ã„ã†ã‚ã‘ã§ï¼Œã™ã£ã‹ã‚Šå‰ç½®ããŒé•·ããªã‚Šã¾ã—ãŸãŒï¼ŒODE(Open Dyamics Engine)講座27を開講ã—ã¾ã™ï¼Žé–¢ç¯€ã®åˆæœŸè§’度を自由ã«è¨å®šã™ã‚‹ã«ã¯ä»¥ä¸‹ã®æ‰‹é †ã§è¡Œã„ã¾ã™ï¼Ž
-
- モデルã®ç”Ÿæˆ
- åˆæœŸé–¢ç¯€è§’度ã®è¨å®š
dJointSetHingeParam()を使ã„,関節角ã®ä¸‹é™ã¨ä¸Šé™ã‚’åˆæœŸè§’度ã®è¿‘å‚ã«è¨å®šã™ã‚‹ï¼Ž - ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®æ›´æ–°
ã“れã«ã‚ˆã‚Šé–¢ç¯€è§’ãŒåˆæœŸè§’度ã«ç§»å‹•ã™ã‚‹ï¼Ž - å„ボディã®ä½ç½®ã¨å§¿å‹¢ã®å–å¾—
å„関節ã®ä¸å¿ƒä½ç½®ã¨å›žè»¢è»¸ã®å–å¾—ã™ã‚‹ï¼Ž - モデルã®ç ´å£Š
ボディã¨ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã‚’ç ´å£Šã™ã‚‹ï¼Ž - モデルã®å†ç”Ÿ
4.ã§å–å¾—ã—ãŸãƒœãƒ‡ã‚£ã®ä½ç½®ã¨å§¿å‹¢ï¼Œé–¢ç¯€ã®ä¸å¿ƒä½ç½®ã¨å›žè»¢è»¸ãªã©ã‚’åˆæœŸå€¤ã¨ã—ã¦ï¼Œãƒ¢ãƒ‡ãƒ«ã‚’å†ç”Ÿã™ã‚‹ï¼Ž
以下ã«ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã®ä¸»è¦éƒ¨åˆ†ã‚’掲載ã—ã¾ã™ï¼Žå®Œå…¨ãªãƒ—ãƒã‚°ãƒ©ãƒ ã¯ã“ã“ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„.
[cpp]
// 2関節,2リンクã®ãƒãƒœãƒƒãƒˆã‚¢ãƒ¼ãƒ ã®ç”Ÿæˆ
// 関節,リンク用ã®é…列ã¯è¦ç´ 数3ã§ã™ï¼Ž
// ã“れã¯ï¼Œï¼ç•ªç›®ã®ãƒªãƒ³ã‚¯ã‚’土å°ï¼Œï¼ç•ªç›®ã®é–¢ç¯€ã‚’固定関節ã¨ã—ã¦
// 地é¢ã¨çµåˆã—ã¦ã„ã‚‹ãŸã‚ã§ã™ï¼Ž
void makeArm()
{
dReal l0[3] = { 0.00, 0.00, 0.05}; // link0ã®ä½ç½®
 dReal l1[3] = { 0.25, 0.00, 0.04}; // link1ã®ä½ç½®
 dReal l2[3] = { 0.75, 0.00, 0.04}; // link2ã®ä½ç½®
 dReal anc0[3] = { 0.00, 0.00, 0.00}; // 関節0ã®ä¸å¿ƒä½ç½®ï¼ˆãƒ€ãƒŸãƒ¼ï¼‰
 dReal anc1[3] = { 0.00, 0.00, 0.04}; // 関節1ã®ä¸å¿ƒä½ç½®
 dReal anc2[3] = { 0.50, 0.00, 0.04}; // 関節2ã®ä¸å¿ƒä½ç½®
 dReal ax0[3] = { 0.00, 0.00, 1.00}; // 関節0ã®å›žè»¢è»¸ï¼ˆãƒ€ãƒŸãƒ¼ï¼‰
 dReal ax1[3] = { 0.00, 0.00, 1.00}; // 関節1ã®å›žè»¢è»¸
 dReal ax2[3] = { 0.00, 0.00, 1.00}; // 関節2ã®å›žè»¢è»¸
 // pos0ã¯è¦ç´ æ•°NUMã®é…列.å„è¦ç´ ãŒconst dRealã¸ã®ãƒã‚¤ãƒ³ã‚¿
const dReal *pos[NUM];
const dReal *R[NUM];
 /*** 1. モデルを作る ***/
// åˆæœŸä½ç½®
pos[0] = l0; pos[1] = l1; pos[2] = l2;
 // åˆæœŸå§¿å‹¢
dMatrix3 tmpR0, tmpR1;
dRSetIdentity(tmpR0); // å˜ä½è¡Œåˆ—,回転ã—ãªã„
 dRFromAxisAndAngle(tmpR1,0,1,0,0.5*M_PI); // y軸をä¸å¿ƒã«Ï€/2回転
R[0] = tmpR0; R[1] = tmpR1; R[2] = tmpR1;
// ジョイント
const dReal *anchor[NUM];
const dReal *axis[NUM];
 // 関節ä¸å¿ƒã¨å›žè»¢è»¸ã®è¨å®š
anchor[0] = anc0; anchor[1] = anc1; anchor[2] = anc2;
axis[0] = ax0; axis[1] = ax1; axis[2] = ax2;
makeLinks(pos,R); // リンクã®ç”Ÿæˆ
makeJoints(anchor, axis); // ジョイントã®ç”Ÿæˆ
/*** 2. åˆæœŸé–¢ç¯€è§’度ã®è¨å®š ***/
// 関節角ã®ä¸Šé™ã¨ä¸‹é™ã‚’åˆæœŸè§’度ã®è¿‘å‚ã«ã™ã‚‹ã“ã¨ã§å¼·åˆ¶çš„ã«ç›®æ¨™è§’度ã«ã™ã‚‹
for (int i = 1; i < NUM; i++) {
  dJointSetHingeParam(joint[i],dParamLoStop, ANGLE0[i] * M_PI/180.0 - 1e-6);
dJointSetHingeParam(joint[i],dParamHiStop, ANGLE0[i] * M_PI/180.0);
}
 /*** 3. シミュレーションを進ã‚ã‚‹ ***/
// ã“れãŒãªã„ã¨é–¢ç¯€ãŒå‹•ã‹ãªã„
for (int j = 0; j < 100; j++) {
  dWorldStep(world, 0.01);
   dJointGroupEmpty(contactgroup);
}
 /*** 4. リンクã®ä½ç½®ã¨å§¿å‹¢ã®å–å¾— ***/
for (int k = 0; k < NUM; k++) {
  pos[k] = dBodyGetPosition(rlink[k].body);
R[k] = dBodyGetRotation(rlink[k].body);
}
/*** 5. ジョイントä¸å¿ƒã®ä½ç½®ã¨å›žè»¢è»¸ã®å–å¾— ***/
anchor[0] = anc0;
 axis[0]  = ax0;
for (int k = 1; k < NUM; k++) {
   dJointGetHingeAnchor(joint[k], (dReal *) anchor[k]);
   dJointGetHingeAxis(joint[k], (dReal *) axis[k]);
}
 // 何故ã‹mingw環境ã§ã¯ï¼Œprintf文を以下ã«å…¥ã‚Œãªã„ã¨anchor, axisãŒåæ˜ ã•れãªã„
 // Linuxã§ã¯æœªç¢ºèªï¼Žprintf("n");ã ã‘ã§ã‚‚OK.
for (int k = 0; k < NUM; k++) {
printf("nanchor[%d]=%5.2f %5.2f %5.2f n",k, anchor[k][0],anchor[k][1],anchor[k][2]);
printf("axis[%d] =%5.2f %5.2f %5.2f n", k, axis[k][0],axis[k][1],axis[k][2]);
 }
/*** 6. モデルã®ç ´å£Šã€€***/
destroyJoints(); // ジョイントã®ç ´å£Š
 destroyLinks(); // リンクã®ç ´å£Š
/*** 7. モデルã®å†ç”Ÿ ***/
makeLinks(pos,R); // リンクã®å†ç”Ÿæˆ
 makeJoints(anchor,axis); // ジョイントã®å†ç”Ÿæˆ
}
[/cpp]
ã“よれよりもã£ã¨ç°¡å˜ãªæ–¹æ³•ãŒã‚れã°ï¼Œã‚³ãƒ¡ãƒ³ãƒˆã‚’é ‚ã‘れã°ã†ã‚Œã—ã„é™ã‚Šã§ã™ï¼Ž
ã¤ã„先日,ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ をダウンãƒãƒ¼ãƒ‰ã•ã›ã¦ã„ãŸã ã„ãŸã‚“ã§ã™ãŒã€ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚µãƒ³ãƒ—ル画åƒã®ã‚ˆã†ãªçŠ¶æ…‹ã«æˆã£ã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚
dRFromAxisAndAngle(tmpR1,0,1,0,0.5*M_PI) 㧠『y軸をä¸å¿ƒã«Ï€/2å›žè»¢ï¼ˆåæ™‚計回り)ã€ã—ã¦ã„ã‚‹ã¯ãšã®link1ã‚‚link2ã‚‚zè»¸ã«æ²¿ã£ãŸã¾ã¾ã«æˆã£ã¦ã„ã¦ã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
サンプルプãƒã‚°ãƒ©ãƒ 内ã®ã©ã“ã‚’ä¿®æ£ã™ã‚Œã°ã‚ˆã„ã§ã—ょã†ã‹ã€‚ã”æ•™æŽˆãŠé¡˜ã„ã„ãŸã—ã¾ã™ã€‚
失礼ã—ã¾ã™ï¼Žè³ªå•よã‚ã—ã„ã§ã—ょã†ã‹ï¼Ž
VC++環境ã§è‡ªå·±æµã«ã¦ãƒ—ãƒã‚°ãƒ©ãƒ ã‚’ã„ã˜ã£ã¦ã„る者ã§ã™ï¼Ž
勉強ã®ãŸã‚ã«ã€Œé–¢ç¯€åˆæœŸè§’度ã®è¨å®šæ³•ã€ã®ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ をダウンãƒãƒ¼ãƒ‰ã•ã›ã¦ã„ãŸã ã„ãŸã®ã§ã™ãŒï¼Œã‚³ãƒ³ãƒ‘イルã¯é€šã‚‹ã®ã«å®Ÿè¡Œæ™‚ã«ãƒªãƒ³ã‚¯ãŒè¡¨ç¤ºã•れã¾ã›ã‚“.
ã¾ãŸ.exeãƒ•ã‚¡ã‚¤ãƒ«ã®æ–¹ã‹ã‚‰é–‹ãã¨ï¼Œä½•æ•…ã‹ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã ã‘ãŒè¡¨ç¤ºã•れã¦ã—ã¾ã„ã¾ã™.
VC++ã ã‹ã‚‰èµ·ã“ã‚‹å•題ãªã®ã§ã—ょã†ã‹ï¼Ÿè§£æ±ºæ–¹æ³•ã®æ¤œè¨ŽãŒä»Šä¸€ã¤æ€ã„ã¤ãã¾ã›ã‚“…
madoã§ã™ï¼Žã‚¢ãƒ¼ãƒ ã®è¡¨ç¤ºçŠ¶æ…‹ã«é–¢ã—ã¦ï¼Œè§£æ±ºã—ã¾ã—ãŸï¼Ž
ãŠä¸–話ã‹ã‘ã¾ã—ãŸï¼Ž
makeArm関数ã®ä¸ã«ã‚りã¾ã™ï¼Œã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã¨ãƒœãƒ‡ã‚£ã®ç ´å£Šã«é–¢ã™ã‚‹éƒ¨ä½ã‚’コメントアウトã—ãŸã¨ã“ã‚,æ£ã—ã„グラフィック表示ã«ãªã‚Šã¾ã—ãŸï¼Ž
destroyJoints関数ã¨destroyLinks関数を外ã—ãŸã“ã¨ã§ä»–ã«å½±éŸ¿ãŒã§ã¦ã„る様åã‚‚ãªã‹ã£ãŸã®ã§ï¼Œã“れã§ã‚ˆã„ã‹ã¨æ€ã„ã¾ã™ï¼Ž
ã©ã†ã‚‚,ã‚りãŒã¨ã†ã”ã–ã„ã¾ã—ãŸï¼Ž