5. ボディ(剛体)ã¨ã‚¸ã‚ªãƒ¡ãƒˆãƒªï¼ˆå½¢çŠ¶ï¼‰

物体ã®å±žæ€§ï¼š ボディã¨ã‚¸ã‚ªãƒ¡ãƒˆãƒª

物体ã®å±žæ€§ï¼šãƒœãƒ‡ã‚£ã¨ã‚¸ã‚ªãƒ¡ãƒˆãƒª

ODE(Open Dynamics Engine)åˆç´šè¬›åº§ã®ï¼•回目ã§ã™ã€‚今回ã¯ï¼Œå‹•力学計算ã®å¯¾è±¡ã¨ãªã‚‹ãƒœãƒ‡ã‚£(剛体,body)ã¨è¡çªæ¤œå‡ºè¨ˆç®—ã®å¯¾è±¡ã¨ãªã‚‹ã‚¸ã‚ªãƒ¡ãƒˆãƒª(geometry)ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ï¼Ž

ODEã§ã¯å‹•力学計算ã¨è¡çªæ¤œå‡ºè¨ˆç®—ãŒç‹¬ç«‹ã«å®Ÿè£…ã•れã¦ã„ã¾ã™ã€‚ã“ã®åˆ©ç‚¹ã¯ï¼Œè‰²ã€…ãªè¡çªæ¤œå‡ºè¨ˆç®—ライブラリを簡å˜ã«ODEã«çµ„ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã‚‹ã“ã¨ã§ã™ã€‚ ç¾åœ¨ï¼ŒODEã¯è¡çªæ¤œå‡ºãƒ©ã‚¤ãƒ–ラリã¨ã—ã¦OPCODEãŒæ¨™æº–ã§ï¼ŒGimpactも利用å¯èƒ½ã§ã™ã€‚ã•らã«ï¼ŒBulletã®è¡çªæ¤œå‡ºã‚‚組ã¿è¾¼ã‚‚ã†ã‹ã¨ã„ã†è©±ã‚‚ã‚りã¾ã™ã€‚OPCODEã¯OpenHRP3ã§ã‚‚使ã‚れã¦ã„ã¾ã™ãŒï¼ŒGimpactã®æ–¹ãŒç²¾åº¦ãŒé«˜ã„ã¨ã„ã‚れã¦ã„ã¾ã™ã€‚

ã‚‚ã†ä¸€ã¤ã®åˆ©ç‚¹ã¨ã—ã¦ã¯ï¼Œç‰©ä½“ã«å¯¾ã—ã¦å‹•力学ã®è¨ˆç®—ã ã‘,ã‚ã‚‹ã„ã¯è¡çªæ¤œå‡ºè¨ˆç®—ã ã‘ã‚’ã§ãã‚‹ã“ã¨ã§ã™ã€‚例ãˆã°ï¼Œã¤ãã°ãƒãƒ£ãƒ¬ãƒ³ã‚¸ã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’作るã¨ãã«å‡ºå…¥ã‚Šå£ã®ã‚³ãƒ³ã‚¯ãƒªãƒ¼ãƒˆãƒ–ロック,ビルや木ãªã©ã«é–¢ã—ã¦ã¯ãƒ­ãƒœãƒƒãƒˆã¨ã®è¡çªæ¤œå‡ºè¨ˆç®—ã ã‘ã‚’ã—ã¦ãれれã°è‰¯ã„å ´åˆãŒå¤šã„ã§ã™ã­ã€‚

ã“ã®ã‚ˆã†ãªåˆ©ç‚¹ã‚’生ã‹ã™ãŸã‚ã«ï¼ŒODEã§ã¯è¡çªæ¤œå‡ºæ©Ÿèƒ½ã‚’使用ã™ã‚‹ã«ã¯è¡çªæ¤œå‡ºç”¨ã®ã‚¹ãƒšãƒ¼ã‚¹(space)ã¨å‹•力学計算用ã®ãƒ¯ãƒ¼ãƒ«ãƒ‰(world)ã®ï¼’ã¤ã‚’生æˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ãれã«ä¼´ã„,物体ã«ï¼’ã¤ã®å±žæ€§ï¼Œã¤ã¾ã‚Šï¼Œå‹•力学計算ã®å¯¾è±¡ã¨ãªã‚‹ãƒœãƒ‡ã‚£(剛体,body)ã¨è¡çªæ¤œå‡ºè¨ˆç®—ã®å¯¾è±¡ã¨ãªã‚‹ã‚¸ã‚ªãƒ¡ãƒˆãƒª(geometry)ã‚’æŒãŸã›ã¦ã„ã¾ã™ã€‚ãªãŠï¼Œå‰›ä½“ã®ã“ã¨ã‚’英語ã§Rigid Bodyã¨ã„ã„,Geometryã¨ã¯å¹¾ä½•学的ãªå½¢çжã¨ã„ã†æ„味ã§ã™ã€‚

ボディã¨ã‚¸ã‚ªãƒ¡ãƒˆãƒªãŒåˆ¥ã€…ã«å®Ÿè£…ã•れ,別々ã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚„スペースã«å­˜åœ¨ã™ã‚‹ãŸã‚ã«ï¼Œä¸¡è€…を関連付ã‘ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼Ž

以下,物体ã®ä½œã‚Šæ–¹ã‚’説明ã—ã¾ã™ï¼Ž

(1) ボディã®ä½œã‚Šæ–¹

ボディã¯ä»¥ä¸‹ã®é †ç•ªã«å¾“ã£ã¦ä½œã‚Šã¾ã™ï¼Ž

  1. ボディã®ç”Ÿæˆ dBodyID dBodyCreate(dWorldID world);
    ボディをワールドworld内ã«ç”Ÿæˆã—,ボディã®IDã‚’è¿”ã—ã¾ã™ï¼Ž
  2. 質é‡ãƒ‘ラメータã®åˆæœŸåŒ– void dMassSetZero(dMass *mass);
    質é‡ï¼Œé‡å¿ƒä½ç½®ï¼Œæ…£æ€§ãƒ¢ãƒ¼ãƒ¡ãƒ³ãƒˆãªã©ãŒå…¥ã£ã¦ã„る質é‡ãƒ‘ラメータmassã‚’åˆæœŸåŒ–ã—ã¾ã™ï¼Ž
  3. 質é‡ãƒ‘ラメータã®è¨ˆç®— void dMassSet***Total(dMass *mass, dReal total_mass, … );
    ***ã«ã¯ãƒœãƒ‡ã‚£ã®ç¨®é¡ž(Shpere, Box, Cylinder, Capsuleãªã©ï¼‰ãŒå…¥ã‚Šã¾ã™ï¼Žmassã¯è³ªé‡ãƒ‘ラメータ,total_massã¯ãƒœãƒ‡ã‚£ã®å…¨è³ªé‡ï¼ŽãªãŠï¼Œå¼•ãæ•°ã¯ãƒœãƒ‡ã‚£ã®ç¨®é¡žã«ã‚ˆã£ã¦é•ã†ã®ã§çœç•¥ã—ã¦ã„ã¾ã™ï¼Žè©³ç´°ã¯API集をã”覧ãã ã•ã„.
  4. ボディã«è³ªé‡ãƒ‘ラメータを設定 void dBodySetMass(dBodyID body, const dMass *mass);
    ボディbodyã«è³ªé‡ãƒ‘ラメータmassを設定ã—ã¾ã™ï¼Ž
  5. ボディã®ä½ç½®ã‚’設定 void dBodySetPosition(dBodyID body, dReal x, dReal y, dReal z);
    ボディbodyを絶対座標系(x,y,z)ã«è¨­å®šã—ã¾ã™ï¼Ž
  6. ボディã®å§¿å‹¢ã‚’設定 void dBodySetRotation(dBodyID, const dMatrix3 R);
    ボディbodyã®å§¿å‹¢ã‚’回転行列Rã«è¨­å®šã—ã¾ã™ï¼Ž

(2) ジオメトリã®ä½œã‚Šæ–¹

次ã«ã‚¸ã‚ªãƒ¡ãƒˆãƒªã®ä½œã‚Šæ–¹ã‚’紹介ã—ã¾ã™ï¼Žãƒœãƒ‡ã‚£ã¨æ¯”較ã™ã‚‹ã¨ç°¡å˜ã§ã™ï¼Žã‚¸ã‚ªãƒ¡ãƒˆãƒªã®ç¨®é¡žã«å¯¾å¿œã—ãŸä»¥ä¸‹ã®APIを呼ã³å‡ºã™ã ã‘ã§ã™ï¼Ž

  • dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz);

space ã§æŒ‡å®šã•れãŸã‚¹ãƒšãƒ¼ã‚¹ã«x,y,z è»¸ã«æ²¿ã£ãŸé•·ã•lx,ly,lz ã®ç›´æ–¹ä½“ジオメトリを生æˆã—,ãã®ID 番å·ã‚’è¿”ã™ï¼Žç›´æ–¹ä½“ジオメトリã®å‚照点ã¯ãã®é‡å¿ƒã§ã‚る.

  • dGeomID dCreateCapsule(dSpaceID space, dReal r, dReal l);

space ã§æŒ‡å®šã•れãŸã‚¹ãƒšãƒ¼ã‚¹ã«åŠå¾„r,長ã•l ã®ã‚«ãƒ—セルジオメトリを生æˆã—,ãã®ID 番å·ã‚’è¿”ã™ï¼Žã‚«ãƒ—ã‚»ãƒ«ã¯æ™®é€šã®å††æŸ±ã®ä¸¡ç«¯ã«åŠçƒã‚’被ã›ãŸã‚ˆã†ãªã‚‚ã®ã§ã‚る.ã“ã®ç‰¹å¾´ã¯è¡çªæ¤œå‡ºã®å†…部コードを拘æŸã‹ã¤æ­£ç¢ºã«ã™ã‚‹ã“ã¨ãŒã§ãる.引数ã®length ã«ã¯åŠçƒã®ã‚­ãƒ£ãƒƒãƒ—を入れãªã„.キャップã®åŠå¾„ã¯å††æŸ±ã®åŠå¾„radius ã¨åŒã˜ã§ã‚る.

  • dGeomID dCreateCylinder(dSpaceID space, dReal r, dReal l);

スペースspaceã«åŠå¾„r,長ã•l ã®å††æŸ±ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’生æˆã—,ãã®ID 番å·ã‚’è¿”ã™ï¼Ž

  • dGeomID dCreateSphere(dSpaceID space, dReal r);

åŠå¾„rã®çƒã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’生æˆã—,ãã®ID 番å·ã‚’è¿”ã™ï¼Ž

  • dGeomID dCreatePlane(dSpaceID space, dReal a, dReal b, dReal c, dReal d);

å¹³é¢ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’与ãˆã‚‰ã‚ŒãŸå¼•æ•°ã«ã‚ˆã‚Šç”Ÿæˆã—,ãã®ID 番å·ã‚’è¿”ã™ï¼Žå¼•æ•°space ãŒ0 ã§ãªã‘れã°ï¼Œãã®space ã«å¹³é¢ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’挿入ã™ã‚‹ï¼Žå¼•æ•°a,b,c,d ã¯å¹³é¢ã®æ–¹ç¨‹å¼ã€€ax+by+cz = d ã®ãƒ‘ラメータã§ã‚る.平é¢ã®æ³•線ベクトルã¯(a,b,c) ã§ã‚り長ã•ã¯ï¼‘ã§ãªã‘れã°ãªã‚‰ãªã„.平é¢ã‚¸ã‚ªãƒ¡ãƒˆãƒªã¯è¨­ç½®ä¸å¯èƒ½(non-placeable),ã¤ã¾ã‚Šä½ç½®ã‚„姿勢を定義ã§ããªã„特別ãªã‚¸ã‚ªãƒ¡ãƒˆãƒªã§å¸¸ã«çµ¶å¯¾åº§æ¨™ç³»ã§å®šç¾©ã—ãªã‘れã°ãªã‚‰ãªã„.ã¤ã¾ã‚Šï¼Œå¹³é¢ã‚ªãƒ–ジェクトã¯å¸¸ã«é™çš„ãªç’°å¢ƒã®ä¸€éƒ¨ã¨ã—ã¦ä½¿ã‚れるã“ã¨ã‚’仮定ã—ã¦ã„る.

 

(3) ボディã¨ã‚¸ã‚ªãƒ¡ãƒˆãƒªã®å¯¾å¿œä»˜ã‘

  • void dGeomSetBody(dGeomID geom, dBodyID body);

    ジオメトリgeomをボディbodyã«é–¢é€£ä»˜ã‘ã¾ã™ï¼Ž

今回,サンプルコードã¯ã‚りã¾ã›ã‚“ãŒï¼ŒODEを使ã„ã“ãªã™ä¸Šã§ã¨ã¦ã‚‚é‡è¦ãªç®‡æ‰€ã§ã—ãŸã€‚次回ã¯ï¼Œã‚µãƒ³ãƒ—ルコードを使ã„,実際ã«è¡çªæ¤œå‡ºã®æ–¹æ³•ã«ã¤ã„ã¦å‹‰å¼·ã—ã¾ã™ã€‚

コメントをã©ã†ãž

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

4,415 views