ODE質å•ãƒ»è¦æœ›å‹Ÿé›†2ï¼
ODEã®è³ªå•ãƒ»è¦æœ›å‹Ÿé›†ã®ã‚³ãƒ¡ãƒ³ãƒˆç·æ•°ãŒï¼•ï¼ä»¶ã‚’è¶…ãˆã¾ã—ãŸï¼Žæœ¬å½“ã«ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ï¼Žã‚³ãƒ¡ãƒ³ãƒˆãŒé•·ããªã‚Šèªã¿ã¥ã‚‰ããªã‚Šã¾ã—ãŸã®ã§æ–°ãŸãªè³ªå•ãƒ»è¦æœ›ã¯æœ€æ–°ã®ODE質å•ãƒ»è¦æœ›å‹Ÿé›†â—‹ï¼ã«æŠ•稿ã—ã¦ãã ã•ã„.
ãªãŠï¼Œå»¶ã³å»¶ã³ã«ãªã£ã¦ã„ãŸåˆå¿ƒè€…用ODE本ã®åŽŸç¨¿è„±ç¨¿ãŒï¼™æœˆæœ«ã¨ãªã‚Šã¾ã—ãŸï¼Žã§ãã‚‹ã ã‘è‰¯ã„æœ¬ã«ã—ãŸã„ã®ã§èª¬æ˜Žã—ã¦æ¬²ã—ã„ã¨ã“ã‚ãŒã‚れã°ã‚³ãƒ¡ãƒ³ãƒˆã—ã¦é ‚ã‘れã°ã‚りãŒãŸã„ã§ã™ï¼Ž
ã•ã£ããï¼Œä»¥ä¸‹ã«æŽ²è¼‰ã—ãŸã†ãˆã®ã•ã‚“ã®ã”質å•ã«å›žç”ã—ã¦ã„ããŸã„ã¨æ€ã„ã¾ã™ï¼Ž
| ã“ã‚“ã°ã‚“ã¯ã€‚
物体ã¨ç‰©ä½“ã®ã‚³ãƒ³ã‚¿ã‚¯ãƒˆæ™‚ã§ã® å‹•ã„ã¦ã‚‹ç´°é•·ã„æ¿(Trimesh)ã®ç¸¦é•·ã®é¢ã‚’常㫠ã¾ãšæ¿ã®å§¿å‹¢ã‚’dBodyGetRotationã§ â‘ FDir1ã®åž‹ã¯dVector3ã¨ã„ã†ã“ã¨ãªã®ã§ã™ãŒ â‘¡å‹•ã„ã¦ã„る物体を元ã«ã—ã¦FDir1ã‚’è¨å®šã™ã‚‹ã«ã¯ â‘¡ã‚‚ã—ã‹ã—ã¦ã€ãã‚‚ãã‚‚FDir1ã‚’å‹•ã„ã¦ã„ã‚‹ 以上ã€ã¡ã‚‡ã£ã¨ã‚ã‹ã‚Šã«ãã„æ–‡ç« ã‹ã¤ã€ ã†ãˆã® |
ã†ãˆã®ã•ん,毎度ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ï¼Ž
â‘ ã®å›žç”:fdir1ã¯ç¬¬ï¼‘摩擦方å‘ã§ï¼Œå˜ä½ãƒ™ã‚¯ãƒˆãƒ«ã‹ã¤æŽ¥è§¦ç‚¹ã®æ³•ç·šæ–¹å‘ã¨åž‚ç›´ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“.æˆåˆ†ã¯ï¼“ã¤ã‚り,ãã®å˜ä½ãƒ™ã‚¯ãƒˆãƒ«ã®x,y,z軸æˆåˆ†ã§ã™ï¼Žã¾ãŸï¼Œã“れをè¨å®šã™ã‚‹ãŸã‚ã«ã¯dContactFdir1ã®ãƒ•ラグを立ã¦ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ï¼Ž
â‘¡ã®å›žç”: ã„ã‚ã„ã‚ãªæ–¹æ³•ãŒã‚ã‚‹ã‹ã¨ã¯æ€ã„ã¾ã™ãŒå§¿å‹¢ã‚’知るã«ã¯dBodyGetRotationã‹dBodyGetQuaternionを通常使用ã™ã‚‹ã¨æ€ã„ã¾ã™ï¼Žãã®ä»–,ボディã«ãƒ’ンジジョイントãŒã‚ã‚‹ãªã‚‰è»¸ã®æ–¹å‘ベクトルを利用ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ï¼Ž
â‘¢ã®å›žç”: 一般的ã‹ã©ã†ã‹ã‚ã‹ã‚Šã¾ã›ã‚“ãŒï¼Œå…¨æ–¹å‘移動ãƒãƒœãƒƒãƒˆã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’作æˆã™ã‚‹ã¨ãã«fdir1ã‚’è¨å®šã—ãŸã“ã¨ãŒã‚りã¾ã™ï¼Ž
以上ã§ã™ï¼Ž
ã‘ã‚“ã™ã‘ã•ã‚“ã€
解決ã—ã¦ä½•よりã§ã™ã€‚
ã¡ãªã¿ã«ã€ODE本ã¯åˆæ ¡ãŒçµ‚ã‚りã¾ã—ãŸã€‚ã“れã‹ã‚‰å†æ ¡ã€ä¸‰æ ¡ãŒã‚ã‚Šã€æ›¸åº—ã«ä¸¦ã¶ã®ã¯ã‚´ãƒ¼ãƒ«ãƒ‡ãƒ³ã‚¦ã‚¤ãƒ¼ã‚¯æ˜Žã‘ã«ãªã‚Šãã†ã§ã™ã€‚
ゆã†ã•ã‚“ã€
ã”質å•ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
返事ãŒé…ããªã‚Šã™ã¿ã¾ã›ã‚“。ボールãŒãƒãƒƒãƒˆã«ãã£ã¤ãã¨ã„ã†æ„味を教ãˆã¦é ‚ã‘ã¾ã™ã‹ï¼Ÿ
両者をfixedジョイントã‹ä½•ã‹ã§å®Œå…¨ã«çµåˆã•ã›ã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã‹ï¼Ÿ
ã¾ãŸã€ç‰©ç†ã®ã”質å•ã«ã¤ã„ã¦ã¯ã“ã®ã‚³ãƒ¼ãƒŠãƒ¼ã§ã¯å¯¾å¿œã§ãã¾ã›ã‚“ã®ã§ã€å¦æ ¡ã®å…ˆç”Ÿã«ãŠèžããã ã•ã„。ãªãŠã€å‰›ä½“をシミュレートã—ãŸã„å ´åˆã¯ã€soft_erp = 1.0, soft_cfm = 0.0並ã³ã«ã‚°ãƒãƒ¼ãƒãƒ«ã®ERPã€CFMã‚‚åŒæ§˜ã«è¨å®šã—ã¦ãã ã•ã„。
ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ï¼Ž
dJointSetHingeParam(dJointID, dParamFMax, fmax);
を残ã—ã¦ã„ãŸã®ãŒã„ã‘ãªã‹ã£ãŸã®ã§ã™ã.解決ã„ãŸã—ã¾ã—ãŸï¼Ž
マニュアルをèªã‚€ã‚ˆã‚Šï¼Œtestプãƒã‚°ãƒ©ãƒ を見る方ãŒã‚ˆã•ãã†ã§ã™ï¼Ž
ODE本楽ã—ã¿ã«ã—ã¦ãŠã‚Šã¾ã™ãƒ¼ï¼Ž
ã‘ã‚“ã™ã‘ã•ã‚“ã€
dJointAddHingeTorque();ã¯dBodyAddTorque()をよã³å‡ºã—ã¦ã„ã‚‹ã ã‘ã§ãƒ¢ãƒ¼ã‚¿ã¨ã¯é–¢ä¿‚ã‚りã¾ã›ã‚“。
力制御ã®å ´åˆã¯ä»¥ä¸‹ã®ï¼’行を削除ã—ã¦ãã ã•ã„。
dJointSetHingeParam(dJointID, dParamVel,u);
dJointSetHingeParam(dJointID, dParamFMax, fmax);
1行目を削除ã—ãŸã ã‘ã§ã¯dParamFMaxãŒæœ‰åйã«ãªã£ã¦ãŠã‚Šã€ã—ã‹ã‚‚dParamVelã®åˆæœŸå€¤ãŒï¼ãªã®ã§ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã¯fmax以上ã®åŠ›ãŒã‹ã‹ã‚‹ã¾ã§å‹•ãã¾ã›ã‚“。ã¡ãªã¿ã«dParamFMaxã®åˆæœŸå€¤ã‚‚ï¼ã§ã™ã€‚
上記ã®ã“ã¨ã¯ode/src/joint.cppã‚’èªã‚ã°ã‚ã‹ã‚Šã¾ã™ã€‚オープンソースã£ã¦æœ¬å½“ã«ã„ã„ã§ã™ã。
ã“ã‚“ã«ã¡ã¯ï¼Žã„ã¤ã‚‚ãŠä¸–話ã«ãªã£ã¦ãŠã‚Šã¾ã™ï¼Ž
早速ã§ã™ãŒï¼Œ
dJointSetHingeParam(dJointID, dParamVel,u);
ã®ã‚ˆã†ã«é–¢ç¯€ã®é€Ÿåº¦åˆ¶å¾¡ã‚’行ã£ã¦ã‚‹ã¨ã“ã‚を,トルク制御を行ã†ã‚ˆã†ã«ã—ãŸã„ã¨æ€ã„,
dJointAddHingeTorque(djointID,u);
ã®ã‚ˆã†ã«å¤‰æ›´ã—ãŸã®ã§ã™ãŒï¼Œåˆ¶å¾¡ã•れã¾ã›ã‚“(å‹•ãã¾ã›ã‚“).
ã“ã®ä»–ã«å¤‰æ›´ï¼Œè¿½åŠ ã™ã¹ã箇所ãŒã‚ã‚‹ã®ã§ã—ょã†ã‹ï¼Ÿ
よã‚ã—ããŠé¡˜ã„ã„ãŸã—ã¾ã™ï¼Ž
ã¯ã˜ã‚ã¾ã—ã¦ã€ã‚†ã†ã¨ã„ã„ã¾ã™ã€‚
妿 ¡ã§å‰›ä½“ã®é‹å‹•ã‚’ç¿’ã£ã¦ã„ã¦ã€ãã®ä¸ã®å•題ã«ãƒãƒƒãƒˆã§ãƒœãƒ¼ãƒ«ã‚’打ã¤ã¨ãã®æ’ƒåŠ›ã®å•題ãŒã‚りã¾ã—ãŸã€‚
ãã“ã§ODEを使ã£ã¦ã©ã†ãªã‚‹ã®ã‹å®Ÿé¨“ã—ãŸã„ã®ã§ã™ã€‚
å•題ã¯é‡åŠ›ãŒç„¡ã„ã¨ä»®å®šã—ã¦ã€ç›´å¾„10cmã€é•·ã•1mã€è³ªé‡1kgã®å††æŸ±ã‚’ãƒãƒƒãƒˆã«è¦‹ç«‹ã¦ã¦å®™ã«æµ®ã‹ã¹ã¾ã™ã€‚
直径5cmã€è³ªé‡100gã®ãƒœãƒ¼ãƒ«ã‚’1.8mé›¢ã‚ŒãŸæ‰€ã‹ã‚‰0.5Nã®åŠ›ã‚’æŽ›ã‘ã¦ã€å††æŸ±ã«ã¶ã¤ã‘ã¾ã™ã€‚
ãƒãƒƒãƒˆã«ãƒœãƒ¼ãƒ«ãŒå½“ãŸã£ãŸã¨ãã€ãƒãƒƒãƒˆã«ãƒœãƒ¼ãƒ«ãŒãã£ã¤ãã¨ã„ã†ãµã†ã«ã—ãŸã„ã®ã§ã™ãŒä»¥ä¸‹ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯
ãƒãƒƒãƒˆã«ãƒœãƒ¼ãƒ«ãŒãã£ã¤ã„ã¦ãれã¾ã›ã‚“。
ã©ã®ã‚ˆã†ã«ã™ã‚Œã°ãƒãƒƒãƒˆã«ãƒœãƒ¼ãƒ«ãŒãã£ã¤ãã®ã§ã—ょã†ã‹ï¼Ÿ
static void nearCallBack(void *data,dGeomID o1,dGeomID o2)
{
static const int N = 4;
int i;
dContact contact[N];
for(i = 0; i < N;i++){
contact[i].surface.mode = dContactBounce | dContactSoftCFM;
contact[i].surface.mu = dInfinity;
contact[i].surface.bounce = 0.0; // (0.0~1.0) å発係数ã¯0ã‹ã‚‰1ã¾ã§
contact[i].surface.bounce_vel = 0.0; // (0.0~1.0) å発係数ã¯0ã‹ã‚‰1ã¾ã§
contact[i].surface.soft_cfm = 0.0001;
}
int n = dCollide(o1,o2,N,&contact[0].geom,sizeof(dContact));
for(i = 0; i < n;i++)
{
dJointID c = dJointCreateContact(world,contactgroup,&contact[i]);
// 接触ã—ã¦ã„ã‚‹ï¼’ã¤ã®geometryã‚’ã‚³ãƒ³ã‚¿ã‚¯ãƒˆã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã§æ‹˜æŸ
dJointAttach (c,dGeomGetBody(contact[i].geom.g1),
dGeomGetBody(contact[i].geom.g2));
}
}
ã¾ãŸã€é•·ã•ã®6分ã®1ã‚ãŸã‚ŠãŒãƒãƒƒãƒˆã®èНã ã¨æ€ã„ã¾ã™ã€‚
芯ã«å½“ãŸã£ãŸå ´åˆãŒãƒãƒƒãƒˆãŒä¸€ç•ªæ—©ã回転ã—ã€ã¶ã¤ã‹ã£ãŸå¾Œã®ãƒœãƒ¼ãƒ«ã¯
速度ãŒç„¡ããªã‚‹ã¨æ€ã£ã¦ã„ãŸã®ã§ã™ãŒã€å®Ÿéš›ã«ã¯ãã†ã§ã¯ãªã„よã†ã§ã™ã€‚
動画を作ã£ã¦ã¿ã¾ã—ãŸã®ã§ã€ã‚‚ã—良ã‹ã£ãŸã‚‰æ•™ãˆã¦ãã ã•ã„。
ダウンãƒãƒ¼ãƒ‰ã‚ーワード:1234
http://www4.axfc.net/uploader/14/so/N14_23469.mpg.html
ODE講座ã„ã¤ã‚‚楽ã—ã¿ã«ã—ã¦ã„ã¾ã™ã€‚
ODEæœ¬ã‚‚é ‘å¼µã£ã¦ãã ã•ã„ï¼
T.Kã•ã‚“
コメントã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
ODE本ã«ã¤ã„ã¦ã¯ã€åˆæ ¡ãŒå‡ºç‰ˆç¤¾ã‹ã‚‰å±Šã„ã¦æ ¡æ£ã‚’ã—ã¦ã„ã‚‹çœŸã£æœ€ä¸ã§ã™ã€‚4月出版を目指ã—ã¦ã„ã¾ã™ã€‚
ã¾ãŸã€ODEã«ã¤ã„ã¦ã¯æœ€è¿‘ã®å¤‰æ›´ã®å¤šããŒã€ãƒãƒªã‚´ãƒ³ã®è¡çªæ¤œå‡ºã®éƒ¨åˆ†ã§ã€0.8ã‹ã‚‰è¡çªæ¤œå‡ºãƒ©ã‚¤ãƒ–ラリã«OPCODEã®ä»–ã«Gimpactã‚‚é¸æŠžã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚今ã¾ã§ãƒãƒªã‚´ãƒ³ã®è¡çªæ¤œå‡ºã«é›£ãŒã‚りã¾ã—ãŸãŒã€ã‹ãªã‚Šæ”¹å–„ã•ã‚Œã‚‹ã¨æ€ã„ã¾ã™ã€‚
ODEã®è§£èª¬æ›¸ãŒæ—¥æœ¬ã«ç„¡ã„ã®ã¯å¯‚ã—ã„ãƒ»ãƒ»ãƒ»ã¨æ€ã£ã¦ã„ãŸã®ã§ã€ODE本ã®å‡ºç‰ˆã«ã¯å¤§ã„ã«æœŸå¾…ã—ã¦ã„ã¾ã™ã€‚
ODE自体ã¯Ver0.8ã¨ã„ã†ã“ã¨ã‚‚ã‚りã€ã¾ã 「ä¸å®Œå…¨ã€ãªéƒ¨åˆ†ãŒã‚るよã†ã§ã™ã€‚
æ—©ã1.0をリリースã—ã¦æ¬²ã—ã„・・・ãªã©ã¨ãƒ©ãƒƒã‚»ãƒ«æ°ã«æœŸå¾…ã—ãŸã„ã¨ã“ã‚ã§ã™ã€‚
CohCohã•ã‚“ã€
åˆã‚ã¾ã—ã¦ã€‚ã§ã‚€ã§ã™ã€‚
ODE講座18ã«ã”質å•ã®å›žç”を書ãã¾ã—ãŸã®ã§å‚考ã«ã—ã¦ãã ã•ã„。説明ãŒçŸã„ã®ã§ã‚ã‹ã‚‰ãªã„ã“ã¨ãŒã‚れã°ã€ï¼¯ï¼¤ï¼¥è¬›åº§ï¼‘8ã®ã‚³ãƒ¡ãƒ³ãƒˆæ¬„ã«æ›¸ãè¾¼ã¿ã‚’ãŠé¡˜ã„ã—ã¾ã™ã€‚