ODEã§å¦ã¶C言語 [Step4: 関数]

ODEã§å¦ã¶C言語ã®Step4ã§ã™ï¼Žä»Šå›žã¯é–¢æ•°ã‚’ç·´ç¿’ã—ã¾ã—ょã†ï¼Žé–¢æ•°ã«ã¤ã„ã¦ã¯æ—¢ã«ã‚ã‹ã£ã¦ã„ã‚‹ã‚‚ã®ã¨ã—,ホームワークを通ã˜ã¦é–¢æ•°ã‚’使ã†ã¨ãƒ—ãƒã‚°ãƒ©ãƒ ãŒã¨ã¦ã‚‚ç°¡å˜ã«ãªã‚‹ã“ã¨ã‚’実感ã—ã¦ã‚‚らã†ã“ã¨ãŒç‹™ã„ã§ã™ï¼Ž
今ã¾ã§æç”»ã«ã¤ã„ã¦å¦ã‚“ã§ãã¾ã—ãŸãŒï¼Œä»Šå›žã‹ã‚‰å‹•力å¦è¨ˆç®—ã‚‚å¦ã‚“ã§ã„ãã¾ã™ï¼Žã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã¨ã—ã¦ã¯ï¼Œç‰©ç†ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§æœ€ã‚‚ç°¡å˜ãªç‰©ä½“ã®è½ä¸‹ã‚’å–り上ã’ã¾ã™ï¼Žãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã®æ•™ç§‘書ã§ã¯åˆã‚ã®ä¾‹é¡Œã¯Hello Worldを表示ã™ã‚‹ä¾‹ãŒå®šç•ªã§ã™ã€‚ã“ã“ã§ã¯Hello Worldã®ç‰©ç†ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ç‰ˆã‚’紹介ã—ã¾ã™ï¼Ž
ODEを使ã£ãŸã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®æµã‚Œã‚’代表的ãªAPIã¨é–¢é€£ä»˜ã‘ã¦åˆ—挙ã—ã¾ã™ã€‚
- ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®æµã‚Œ
- ODEã®åˆæœŸåŒ– dInitODE()
- 動力å¦è¨ˆç®—ã®ä¸–界worldã®ç”Ÿæˆ dWorldCreate()
- é‡åŠ›åŠ é€Ÿåº¦ã®è¨å®š dWorldSetGravity()
- 剛体ã®ç”Ÿæˆ
- 質é‡ã®è¨å®š dBodySetMass()
- ä½ç½®ã®è¨å®š dBodySetPosition()
- å§¿å‹¢ã®è¨å®š dBodySetRotation()
- シミュレーションループ(ã“ã®éƒ¨åˆ†ã¯ç¹°ã‚Šè¿”ã—実行ã•れる)
- 動力å¦è¨ˆç®—ã®å®Ÿæ–½ dWorldStep()
- シミュレーションã«å¿…è¦ãªå‡¦ç†ã‚’書ã
- 動力å¦worldã®ç ´å£Š dWorldDestroy()
- ODEã®çµ‚了 dCloseODE()
- 動力å¦è¨ˆç®—
ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®æµã‚Œã§ã¯è‰²ã€…ãªAPIを使ã£ã¦ã„ã¾ã™ãŒã€ä»Šå›žã¯ç‰©ç†ã‚¨ãƒ³ã‚¸ãƒ³ã®æœ€ã‚‚é‡è¦ãªå‹•力å¦è¨ˆç®—ã®ï¼¡ï¼°ï¼©ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚動力å¦è¨ˆç®—ã‚’ã™ã‚‹APIã¯dWorldStep()ã§ã™ï¼Žã“ã®APIã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§æ¯Žå›žå‘¼ã³å‡ºã•ãªã‘れã°ã„ã‘ãªã„ã®ã§ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã®ã‚ˆã†ã«simLoop関数ã®ä¸ã§å‘¼ã³å‡ºã—ã¦ãã ã•ã„.
- void dWorldStep(dWorldID, dReal stepsize)ï¼›
- void dWorldQuickStep(dWorldID, dReal stepsize);
シミュレーションを引数stepsieze[s]ã ã‘1ステップ進ã‚ã¾ã™ã€‚stepsizeã¯æ•°å€¤ç©åˆ†ã®æ™‚間刻ã¿å¹…ã€å˜ä½ã¯ç§’。大ãã„ã¨ç²¾åº¦ãŒæ‚ªããªã‚Šã¾ã™ãŒã€ã‚¹ãƒ”ードã¯é…ããªã‚Šã¾ã™ã€‚
- ソースコード
次ã«ã€è©³ã—ã„コメントã®ã¤ã„ãŸã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚main関数ã‹ã‚‰èªã‚“ã§ãã ã•ã„。
/* step4 リンゴ(林檎)ã®è½ä¸‹  */ #include "dm4.h" dWorldID world; // 動力å¦ã®ä¸–界 dBodyID apple; // リンゴ dReal r = 0.2, m = 1.0; // リンゴã®åŠå¾„,è³ªé‡ void simLoop(int pause) /*** シミュレーションループ ***/ { dWorldStep(world,0.01); // シミュレーションを1ステップ進ã‚ã‚‹ dsSetColor(1.0,0.0,0.0); // 赤色ã®è¨å®š(r,g,b) const double *p = dBodyGetPosition(apple); // ä½ç½®ã‚’å–å¾— const double *R = dBodyGetRotation(apple); // 姿勢をå–å¾— dsDrawSphere(p,R,r); // ãƒªãƒ³ã‚´ã®æç”» } int main() /*** main関数 ***/ {  dInitODE(); // ODEã®åˆæœŸåŒ– world = dWorldCreate(); // 世界ã®å‰µé€ dWorldSetGravity(world,0,0,-0.2); // é‡åŠ›è¨å®š apple = dBodyCreate(world); // リンゴã®ç”Ÿæˆ dMass mass; // æ§‹é€ ä½“massã®å®£è¨€ dMassSetZero(&mass); // æ§‹é€ ä½“massã®åˆæœŸåŒ– dMassSetSphereTotal(&mass,m,r); // æ§‹é€ ä½“massã«è³ªé‡ã‚’è¨å®š dBodySetMass(apple,&mass); // リンゴã«massã‚’è¨å®š dBodySetPosition(apple, 0.0, 0.0, 2.0); // ä½ç½®è¨å®š(x,y,z) dmLoop(800, 600); // ウインドウã®å¹…,高  dWorldDestroy(world); // 世界ã®ç ´å£Š  dCloseODE(); // ODEã®çµ‚了 return 0; } - ã“れã¯èµ¤çމã®è‡ªç”±è½ä¸‹ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã™ã€‚ODEã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®æµã‚Œã§ã¯ã€ã¾ãšã€dInitODE()ã§ODEã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚次ã«ã€ç‰©ç†è¨ˆç®—ã‚’ã™ã‚‹world(ワールド)をdWorldCreate()ã§ä½œã‚Šã¾ã™ã€‚物ç†è¨ˆç®—ã‚’å—ã‘る物体ã¯ãã®ä¸ã«ä½œã‚‰ãªã‘れã°ãªã‚Šã¾ã›ã‚“。ODEã§ã¯ç‰©ä½“ã®ã“ã¨ã‚’body(ボディ)ã¨å‘¼ã‚“ã§ã„ã¾ã™ã€‚物体ã¯dBodyCreate(world)ã§ä½œã‚Šã¾ã™ã€‚物体を作ã£ãŸã‚‰ã€æ¬¡ã«ãã®è³ªé‡ãƒ‘ラメータã¨ä½ç½®ã‚„姿勢をè¨å®šã—ã¾ã™ã€‚ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯çƒã®è³ªé‡ãƒ‘ラメータã¨ä½ç½®ã ã‘ã‚’è¨å®šã—ã¦ã„ã¾ã™ã€‚
物体ã®ç”Ÿæˆã¨è¨å®šãŒçµ‚ã‚ã£ãŸã‚‰ã€æ¬¡ã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’進ã‚ã¾ã™ã€‚ã“れã¯dmLoop()ã§ç¹°ã‚Šæ›¿ãˆã—simLoop関数ãŒå‘¼ã³å‡ºã™ã“ã¨ã«ã‚ˆã‚Šå®Ÿè¡Œã•れã¦ã„ã¾ã™ã€‚simLoop関数ã®dWorldStep(world, 0.05)ã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’1ステップ進ã‚ã¦ã„ã¾ã™ã€‚進ã‚る時間ã¯ï¼’番目ã®å¼•æ•°ã€ã“ã®å ´åˆã¯0.05ç§’ã¨ãªã‚Šã¾ã™ã€‚dsDrawSphere()ã§è½ä¸‹ã™ã‚‹çƒã‚’表示ã—ã¦ã„ã¾ã™ã€‚
シミュレーションãŒçµ‚ã‚ã‚‹ã¨ï¼Œå¾Œç‰‡ä»˜ã‘を行ã„ã¾ã™ã€‚dWorldDestroy(world)ã§ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’ç ´å£Šã—,dCloseODE()ã§ODEã®çµ‚了処ç†ã‚’ã—ã¾ã™ã€‚
ãªãŠã€å°æ–‡å—ã®dã§å§‹ã¾ã‚‹é–¢æ•°ã¯ODEã®API(application interface)ã§ã€dsã§å§‹ã¾ã‚‹é–¢æ•°ã¯drawstuff(ドãƒãƒ¼ã‚¹ã‚¿ãƒƒãƒ•)ã®APIã§ã™ã€‚drawstuffã¯ODE付属テストプãƒã‚°ãƒ©ãƒ 表示用ã®ãƒ©ã‚¤ãƒ–ラリã®ã“ã¨ã§ã™ã€‚最後ã«ï¼Œdmã§å§‹ã¾ã‚‹é–¢æ•°ã¯ç§ã®ä½œæˆã—ãŸé–¢æ•°ã§ã™ï¼Ž
ã“ã“ã§ã¯é‡åŠ›åŠ é€Ÿåº¦ã‚’èµ¤çŽ‰ãŒã‚†ã£ãりè½ä¸‹ã—ã¦ã„ãã¾ã™ãŒã€ãªã‚“ã¨åœ°é¢ã‚’通り抜ã‘ã¦æ¶ˆãˆã¦ã—ã¾ã„ã¾ã™ã€‚実ã¯ä¸Šã®ãƒ—ãƒã‚°ãƒ©ãƒ ã«ã¯è¡çªæ¤œå‡ºæ©Ÿèƒ½ãŒçµ„ã¿è¾¼ã¾ã‚Œã¦ã„ãªã‹ã£ãŸã®ã§ã™ã€‚
- step4-090626.zipをダウンãƒãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—よã†ï¼
- ODE本をèªã‚“ã§ï¼Œãƒœãƒƒã‚¯ã‚¹ï¼ˆç›´æ–¹ä½“)をè½ä¸‹ã•ã›ã‚ˆï¼
- ODE本をèªã‚“ã§ï¼Œå††æŸ±ã‚’è½ä¸‹ã•ã›ã‚ˆï¼
- ODE本をèªã‚“ã§ï¼Œã‚«ãƒ—セルをè½ä¸‹ã•ã›ã‚ˆï¼
- 上ã§ä½œæˆã—ãŸãƒ—ãƒã‚°ãƒ©ãƒ ã®ä¸ã§çƒã‚’作るã¨ã“ã‚を関数化ã—ãªã•ã„.引数ã¨ã—ã¦ä½ç½®ï¼Œå§¿å‹¢ï¼Œç‰©ä½“生æˆã«å¿…è¦ãªãƒ‘ラメータを使ã†ã“ã¨ï¼Ž
- dBodyID  dmCreateSphere(double p[3],  double  R[12],  double  r , double m);
- ä½ç½®ã€€p[3],  姿勢 R[12],  åŠå¾„ r,  質é‡ã€€m
- åŒæ§˜ã«ãƒœãƒƒã‚¯ã‚¹ã®ç”Ÿæˆã‚’関数化ã—ãªã•ã„.
- dBodyID Â dmCreateBox(double p[3], double R[12], double sides[3], double m);
- ä½ç½®ã€€p[3],  姿勢 R[12],  サイズ sides[3], åŠå¾„ r,  質é‡ã€€m
- 円柱ã®ç”Ÿæˆã‚’関数化ã—ãªã•ã„.
- dBodyID  dmCreateCylinder(double p[3], double R[12], double l, double r, double  m, int dir);
- ä½ç½®ã€€p[3],  姿勢 R[12],  åŠå¾„ r,  質é‡ã€€m, Â é•·è»¸ã®æ–¹å‘ dir
- カプセルã®ç”Ÿæˆã‚’関数化ã—ãªã•ã„.
- dBodyID Â dmCreateCapsule(double p[3], double R[12], double l, Â double r);
- ä½ç½®ã€€p[3],  姿勢 R[12],  åŠå¾„ r,  質é‡ã€€m, Â é•·è»¸ã®æ–¹å‘ dir