ODEプãƒã‚ャンプ2:ãƒãƒœã‚«ãƒƒãƒ—・プãƒã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’作ã‚ã†ï¼
Â

Â
時ãŒçµŒã¤ã®ã¯æœ¬å½“ã«æ—©ã„ã‚‚ã®ã§ï¼Œã“ã®é–“æš‘ã„ã¨æ€ã£ã¦ã„ãŸã‚‰ã‚‚ã†ã™ã£ã‹ã‚Šç§‹ã§ã™ãï¼Žï¼‘ï¼æœˆï¼‘6~18日ã¨å¦™é«˜é«˜åŽŸã«ã‚る大å¦ã®ã‚»ãƒŸãƒŠãƒ¼ãƒã‚¦ã‚¹ã«ç ”究室ã®å¦ç”Ÿã¨è¡Œã,ã¾ã˜ã‚ã«è¼ªè¬›ã‚„テニスを楽ã—ã¿ã¾ã—ãŸï¼Žå±±ã¯ã‚‚ã†ã™ã£ã‹ã‚Šç´…葉ãŒè‰²ã¥ã美ã—ã‹ã£ãŸã®ãŒå°è±¡çš„ã§ã—ãŸï¼Ž
ã•ã¦ï¼ŒOpen Dynamics Engine プãƒã‚ャンプもデビューã—ã¦ã‹ã‚‰ï¼’ヶ月ãŒã™ãŽï¼Œæ–°ã—ã„ãƒãƒœã‚³ãƒ³ãƒžã‚¬ã‚¸ãƒ³ï¼ˆNo.48)ãŒï¼‘ï¼æœˆï¼‘4日(土)ã«ç™ºå£²ã•れã¾ã—ãŸï¼Ž
今回ã¯é€£è¼‰ï¼’回目ã¨ãªã‚Šã¾ã™ï¼Žé€£è¼‰ãŒå…¨ï¼”回ã—ã‹ãªã„ã®ã«ã‚‚é–¢ã‚らãšï¼Œã‚°ãƒªãƒ¼ãƒ‡ã‚£ï¼ˆgreedy)ã«ã‚‚最終回ã¯ï¼’脚æ©è¡Œãƒãƒœãƒƒãƒˆã®ãƒ—ãƒã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã‚’作るã“ã¨ã‚’目標ã¨ã—ã¦ã„ã‚‹ãŸã‚,今回ã¯è»Šè¼ªåž‹ãƒãƒœãƒƒãƒˆï¼Œæ¬¡å›žã¯ãƒãƒœãƒƒãƒˆã‚¢ãƒ¼ãƒ ã®ãƒ—ãƒã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã¨ãƒ‰ãƒ³ãƒ‰ãƒ³ä½œã£ã¦ã„ãã¾ã™ï¼Ž
ãƒãƒœã‚³ãƒ³ãƒžã‚¬ã‚¸ãƒ³ã§ã¯ç´™é¢ãŒé™ã‚‰ã‚Œã¦ã„ã‚‹ãŸã‚詳ã—ã説明ã§ãã¾ã›ã‚“.ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ãれを補ã†ãŸã‚,サンプルプãƒã‚°ãƒ©ãƒ ã®å…¨ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¨è±ªè¯ä»˜éŒ²ï¼Ÿã¨ã—ã¦é€£è¼‰ã«ç™»å ´ã—ãŸAPI集を掲載ã—ã¦ã„ã¾ã™ï¼Ž
- å›ã‚‚サンプルプãƒã‚°ãƒ©ãƒ をゲットã—よã†ï¼
- プãƒã‚°ãƒ©ãƒ 1(自由è½ä¸‹ï¼šè¡çªæ¤œå‡ºãªã—)
ゆã£ãりè½ä¸‹ã—ã¦ã„ãã¨ï¼Žï¼Žï¼Ž
- プãƒã‚°ãƒ©ãƒ 2(自由è½ä¸‹ï¼šè¡çªæ¤œå‡ºã‚り)
地é¢ã«ç€é™¸
- プãƒã‚°ãƒ©ãƒ 3(プãƒã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ï¼‰
ãƒãƒ³ã‚°ã‚·ãƒ¥ãƒ¼ãƒˆï¼
- 注1:ã“れらã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¯ODE教育用ã®ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã¨ã—ã¦æ›¸ã„ãŸã‚‚ã®ã§ï¼Œãƒãƒœã‚³ãƒ³ãƒžã‚¬ã‚¸ãƒ³ã®è¨˜äº‹ã§èª¬æ˜Žã—ã¦ã„る全サンプルプãƒã‚°ãƒ©ãƒ ã§ã™ï¼Žä¸Šã®ãƒ—ãƒã‚°ãƒ©ãƒ を自由ã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¦éŠã‚“ã§ãã ã•ã„.ã“れらã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¯ç„¡ä¿è¨¼ã§ã™ï¼ŽãªãŠï¼Œå†é…布åŠã³ç„¡æ–転載ç‰ã¯ãŠæ¢ã‚ãã ã•ã„.
- 注2:mingw, linux, cygwin. OS Xã«å¯¾å¿œã—ã¦ã„ã¾ã™ï¼Žã”自分ã®ç’°å¢ƒã®makefile(例ãˆã°makefile.linux)をmakefileã«ã‚³ãƒ”ーã—ã¦ã‹ã‚‰makeã—ã¦ãã ã•ã„.ãªãŠï¼Œã‚ªãƒªã‚¸ãƒŠãƒ«ã®makefileã¯mingw用ã«ãªã£ã¦ã„ã¾ã™ã®ã§mingwを利用ã•れã¦ã„ã‚‹æ–¹ã¯ã‚³ãƒ”ーã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“.
- makeを実行ã—ãŸã¨ã[cannot found -lode]ãªã©ã¨ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ã«æ€’ã‚‰ã‚ŒãŸæ–¹ã¯odeã®ãƒ©ã‚¤ãƒ–ãƒ©ãƒªãŒæ‰€å®šã®ä½ç½®ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã›ã‚“。mingwã‚„cygwinターミナルを開ã以下ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¦ãã ã•ã„。
- cd  /home/ユーザå/src/ode-0.6
- make  install
ã¾ãŸï¼Œé€£è¼‰ã‚’èªã‚“ã§ã‚ˆãã‚ã‹ã‚‰ãªã„æ–¹ã¯æ˜¯éžã“ã®ãƒšãƒ¼ã‚¸ã§è³ªå•ã—ã¦ãã ã•ã„ï¼Žæ„Ÿæƒ³ã‚„ã”æ„見ç‰ã‚‚大æ“迎ã§ã™ï¼Ž

今回ã®ç›®çމã¯ä¸Šã«ã‚ã‚‹ãƒãƒœã‚«ãƒƒãƒ—ä¸åž‹ãƒãƒœãƒƒãƒˆãƒªãƒ¼ã‚°ã®ãƒ—ãƒã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ã§ã™ï¼Žç”»é¢ã®ä¸å¤®ã‚ˆã‚Šå°‘ã—å·¦ã«è¦‹ãˆã‚‹èµ¤ã„物体ã¯ãƒœãƒ¼ãƒ«ã§ï¼Œä¸å¤®ã«ã‚ã‚‹é»’ã„物体ã¯ãƒãƒœãƒƒãƒˆã§ï¼ŒFu Fightersã®ãƒãƒ³ã‚°ã‚·ãƒ¥ãƒ¼ãƒˆã‚’シミュレートã—ã¦ã„ã¾ã™ï¼ŽéŠã³æ–¹ã‚„ダウンãƒãƒ¼ãƒ‰ã®æ–¹æ³•ã¯ãƒãƒœã‚³ãƒ³ãƒžã‚¬ã‚¸ãƒ³No.48ã®è¨˜äº‹ã‚’èªã‚“ã§ãã ã•ã„.
- サンプルプãƒã‚°ãƒ©ãƒ
- プãƒã‚°ãƒ©ãƒ 1
- プãƒã‚°ãƒ©ãƒ 2
- プãƒã‚°ãƒ©ãƒ 3
実行開始時ã®è¨å®šã§ã¯ã‚«ãƒ¡ãƒ©ã‚’é æ–¹ã«è¨å®šã—ã¦ã„ã‚‹ãŸã‚ãƒãƒœãƒƒãƒˆç‰ãŒã‚ˆã見ãˆã¾ã›ã‚“.
ウインドウã®éš…をドラッグã—ã¦ã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã‚’大ããã™ã‚‹ã‹ï¼Œãƒžã‚¦ã‚¹ãƒœã‚¿ãƒ³ï¼ˆå·¦ï¼Œå³ï¼‰ã‚’押ã—ãªã‚‰ç”»é¢ã‚’ドラッグã™ã‚‹ã¨è¦–線,大ãã•ãªã©ã‚’変更ã§ãã¾ã™ï¼Ž
- makeを実行ã—ãŸã¨ã[-lode cannot found]ãªã©ã¨æ€’ã‚‰ã‚ŒãŸæ–¹ã¯odeã®ãƒ©ã‚¤ãƒ–ãƒ©ãƒªãŒæ‰€å®šã®ä½ç½®ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã›ã‚“。mingwã‚„cygwinターミナルを開ã以下ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¦ãã ã•ã„。
- cd  /home/ユーザå/src/ode-0.6
- make  install
Â
- dBodyID dBodyCreate(dWorldID world)
剛体を作りã€ãã®ID番å·ã‚’戻り値ã¨ã—ã¦è¿”ã™ - const dReal *dBodyGetPosition(dBodyID body)
剛体bodyã®é‡å¿ƒä½ç½®ã‚’å–å¾—ã—ãã®ãƒã‚¤ãƒ³ã‚¿ã‚’返㙠-  const dReal *dBodyGetRotation(dBodyID body)
回転行列をå–å¾—ã—ãã®ãƒã‚¤ãƒ³ã‚¿ã‚’返㙠- void dBodySetMass(dBodyID body, const dMass *mass)
剛体bodyã«è³ªé‡ãƒ‘ラメータmassã‚’è¨å®šã™ã‚‹ - void dBodySetPosition(dBodyID body, dReal x, dReal y, dReal z)
剛体bodyã®é‡å¿ƒã‚’絶対座標系(x,y,z)ã®ä½ç½®ã«è¨å®šã™ã‚‹ - void dBodySetRotation(dBodyID body, const dMatrix3 R)
剛体bodyを回転行列Rã§è¡¨ã™å§¿å‹¢ã«è¨å®šã™ã‚‹ - dGeomID dCreateBox(dSpaceID space, dReal lx, dReal ly, dReal lz)
spaceã«å„辺ã®é•·ã•(lx,ly,lz)ã®ç›´æ–¹ä½“ジオメトリを生æˆã™ã‚‹ - dGeomID dCreateCylinder(dSpaceID space, dReal r, dReal l)
åŠå¾„rã€é•·ã•lã®å††æŸ±ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’生æˆã—ã€ãã®ID番å·ã‚’返㙠-  dGeomID dCreatePlane(dSpaceID space ,dReal a, dReal b, dReal c, dReal d)
spaceã«ax+by+cz=dã®å¹³é¢ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’生æˆã™ã‚‹ - void dGeomSetBody(dGeomID geom, dBodyID body)
物体ã®2ã¤ã®å±žæ€§ã§ã‚るジオメトリgeomã¨å‰›ä½“bodyを関連ã¥ã‘ã‚‹ - dSpaceID dHashSpaceCreate(0)
è¡çªè¨ˆç®—用スペースを生æˆã—ã€ãã®ID番å·ã‚’返㙠- void dJointGroupEmpty(dJointGroupID)
æŽ¥è§¦ç‚¹ãŒæ ¼ç´ã•れã¦ã„るジョイントグループを空ã«ã™ã‚‹ -  void dJointAttach(dJointID joint, dBodyID body1, dBodyID dBody2)
剛体body1ã¨body2ã«ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆjointã‚’å–り付ã‘ã‚‹ -  dJointGroupID dJointGroupCreate(0)
接触点ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æ ¼ç´ã™ã‚‹ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã‚°ãƒ«ãƒ¼ãƒ—を生æˆã—ã€ãã®ID番å·ã‚’返㙠-  void dJointSetHingeAnchor(dJointID joint, dReal x, dReal y, dReal z)
ヒンジジョイントã®å›žè»¢è»¸ã®ä¸å¿ƒç‚¹(x,y,z)ã‚’è¨å®šã™ã‚‹ -  void dJointSetHingeAxis(dJointID joint, dReal x, dReal y, dReal z)
ヒンジジョイントã®å›žè»¢è»¸ãƒ™ã‚¯ãƒˆãƒ«(x,y,z)ã‚’è¨å®šã™ã‚‹ - void dMassSetBoxTotal(dMass *mass, dReal m, dReal lx, dReal ly, dReal lz)
サイズ(lx,ly,lz)ã€å…¨è³ªmã®ç›´æ–¹ä½“ã®è³ªé‡ãƒ‘ラメータmassを計算ã™ã‚‹ - void dMassSetCylinderTotal(dMass *mass, dReal m, int dir, dReal r, dReal l)
æ–¹å‘dir(1=x,2=y,3=z)ã€åŠå¾„rã€é•·ã•lã€å…¨è³ªé‡mã®å††æŸ±ã®è³ªé‡ãƒ‘ラメータmassを計算ã™ã‚‹ -  void dMassSetZero(dMass *mass)
質é‡ãƒ‘ラメータmassã®è¦ç´ ã‚’0ã«åˆæœŸåŒ–ã™ã‚‹ - void dRFromAxisAndAngle(dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle)軸ベクトル(ax,ay,az)周りã«angle[rad]回転ã•ã›ãŸæ™‚ã®å›žè»¢è¡Œåˆ—Rを求ã‚ã‚‹
- Â void dSpaceCollide(dSpaceID space, void *data, dNearCallback *callback)
spaceã§è¡çªã™ã‚‹å¯èƒ½æ€§ã®ã‚ã‚‹2ã¤ã®ã‚¸ã‚ªãƒ¡ãƒˆãƒªã‚’é¸ã³å‡ºã—ã€å¼•æ•°ã®callback関数を呼ã³å‡ºã™ã€‚dataã¯callbacké–¢æ•°ã¸æ¸¡ã™ãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - dWorldID dWorldCreate()
物ç†è¨ˆç®—用ワールドを生æˆã—ã€ãã®ID(è˜åˆ¥)番å·ã‚’戻り値ã¨ã—ã¦è¿”ã™ - void dWorldDestroy(dWorldID world)
物ç†è¨ˆç®—用ワールドworldã‚’ç ´å£Šã™ã‚‹ - void dWorldSetGravity(dWorldID world, dReal x, dReal y, dReal z)
ワールドworldã«(x,y,z)[m/s2]ã®é‡åŠ›åŠ é€Ÿåº¦ã‚’è¨å®šã™ã‚‹ - void dWorldStep(dWorldID world, dReal step_size)
ワールドworldã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’1ステップ進ã‚る。2番目ã®å¼•æ•°step_sizeã¯ç©åˆ†ã®ã‚¹ãƒ†ãƒƒãƒ—時間[s] -  void dsDrawBoxD(const double pos[3], const double R[12], const double sides[3])ä½ç½®posã«å›žè»¢è¡Œåˆ—Rã‚’å–るサイズsidesã®ç›´æ–¹ä½“ã‚’æç”»ã™ã‚‹
- void dsSetViewPoint(float xyz[3], float hpr[3])
視点xyzã¨è¦–ç·šhpr[°]ã‚’è¨å®šã™ã‚‹ - void dsSimulationLoop(int argc, char **argv,int w, int h, dsfunction *fn)
シミュレーションループを呼ã³å‡ºã™ã€‚1ã€2番目ã®å¼•æ•°ã¯main関数ã®å¼•æ•°ã§ã€3,4ç•ªç›®ã¯æç”»ã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã®å¤§ãã•(横w,縦h)ã§ã€5番目ã®å¼•æ•°ã¯æç”»é–¢æ•°ã‚¯ãƒ©ã‚¹
shanã•ã‚“ã€
æ–°å¹´ã‚ã‘ã¾ã—ã¦ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ã€‚今年もdemura.netをよã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚
妙高高原ã«ã‚¹ã‚ーã«ã„ã£ã¦è¿”事ãŒé…ããªã‚Šã¾ã—ãŸã€‚今年ã¯é›ªãŒå°‘ãªã„ã§ã™ã€‚
ã•ã¦ã€simLoop関数ã¯ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã§ã¯è¦‹ãˆã¾ã›ã‚“ãŒwhileループã®ä¸ã«ã‚りã€ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®å„ステップ毎ã«ã‚ˆã³ã ã•れã¦ã„ã¾ã™ã€‚
simLoop関数ã®ä¸ã«å„ステップ毎ã®ãƒãƒœãƒƒãƒˆã®å‹•作を記述ã—ã¦ãã ã•ã„。
ã“ã®ã‚µãƒ³ãƒ—ãƒ«ã‚’æ”¹é€ ã—ã¦ãƒãƒœãƒƒãƒˆã«ã‚らã‹ã˜ã‚プãƒã‚°ãƒ©ãƒ ã—ãŸå‹•ãã‚’ã•ã›ãŸã„ã®ã§ã™ãŒã€ã©ã“を変ãˆã‚Œã°ã„ã„ã®ã§ã—ょã†ã‹ï¼Ÿ
最終的ã«ã¯static void simLoopã®ã¨ã“ã‚ã«left_velã¨right_velã®å€¤ã‚’書ã出ã™ã‚ˆã†ã«ã™ã‚Œã°ã„ã„ã‹ã¨æ€ã„ã¾ã™ãŒã€ã©ã“ã«ãƒ«ãƒ¼ãƒ—を作ã£ã¦ãƒãƒœãƒƒãƒˆã®å‹•ãを計算ã•ã›ãŸã‚‰ã„ã„ã‹ã‚ã‹ã‚Šã¾ã›ã‚“。
よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚
片岡ã•ã‚“ã€
ã„ã¤ã‚‚è²´é‡ãªã‚³ãƒ¡ãƒ³ãƒˆã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚大変助ã‹ã‚Šã¾ã™ã€‚
ソースコードã®è©²å½“箇所を2ã‹ã‚‰2.0ã«å¤‰æ›´ã—ã¾ã—ãŸã€‚
VCã§ã®ã‚³ãƒ³ãƒ‘イルエラーã®å ±å‘Šã§ã™ã€‚
サンプルã®ãƒ—ãƒã‚°ãƒ©ãƒ 3ã§ï¼’82行目ã®éƒ¨åˆ†ã§ã™ãŒ
dReal vmax45 = POWER * 0.01 * 8.0 / sqrt(2);
関数sqrt()ã®å¼•æ•°ã‚’2.0ã‹2.0fã«å¤‰ãˆãªã„ã¨ã‚ªãƒ¼ãƒãƒ¼ãƒãƒ¼ãƒ‰ãŒè§£æ±ºå‡ºæ¥ãªã„ã¨ã„ã†ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¦ã—ã¾ã„ã¾ã™ã€‚