ODEã§å¦ã¶C言語2 [Step4: 関数]
ODEã§å¦ã¶C言語ã®Step4ã§ã™ï¼Žä»Šå›žã¯ç§ãŒODEã®APIã‚’å…ƒã«ä½œæˆã—ãŸé–¢æ•°ã‚’使ã„,赤ã„çƒã‚’è½ä¸‹ã•ã›ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を説明ã—ã¾ã™ï¼Ž
今ã¾ã§ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯æç”»ã ã‘ã§ã—ãŸãŒï¼Œä»Šå›žã‹ã‚‰ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚„ゲームを作るãŸã‚ã«å¿…è¦ãªå‹•力å¦è¨ˆç®—ã‚„è¡çªæ¤œå‡ºè¨ˆç®—ã‚‚å«ã‚“ã§ã„ã¾ã™ï¼Žã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã¨ã—ã¦ã¯ï¼Œç‰©ç†ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§æœ€ã‚‚ç°¡å˜ãªç‰©ä½“ã®è½ä¸‹ã‚’å–り上ã’ã¾ã™ï¼ŽC言語ãªã©ã®ãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã®æ•™ç§‘書ã§ã¯åˆã‚ã®ä¾‹é¡Œã¯Hello Worldを表示ã™ã‚‹ä¾‹ãŒå®šç•ªã§ã™ã€‚ã“ã“ã§ã¯Hello Worldã®ç‰©ç†ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ç‰ˆã‚’紹介ã—ã¾ã™ï¼Ž
- API
ã“ã“ã§ã¯ç°¡å˜ã«ã™ã‚‹ãŸã‚ã«ODEã®APIã‚’å…ƒã«ï¼Œè¶…ç°¡å˜ãªAPIを作æˆã—ã¾ã—ãŸï¼ŽãŸã ã—ã€ODEã®APIã®ã‚ˆã†ã«ç´°ã‹ã„ã“ã¨ã¯ã§ãã¾ã›ã‚“。
- void dmInit()ï¼›
ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åˆæœŸåŒ–ã—ã¾ã™ï¼Ž - void dmCreateSphere(dmObject *obj, double p[3], double R[12], double m, double r, double color[3]);
çƒã‚’作æˆã—ã¾ã™ï¼Žå¼•æ•°ã®p[3]ã¯ä½ç½®(x,y,z)[m],R[12]ã¯å§¿å‹¢ï¼ˆå›žè»¢è¡Œåˆ—), mã¯è³ªé‡[kg],rã¯åŠå¾„[m],color[3]ã¯è‰²(赤,緑,é’儿ˆåˆ†ã€å€¤ã¯0以上1以下)ã§ã™ï¼Ž - void dmSimStep();
シミュレーションを1ステップ進ã‚ã¾ã™ï¼Ž - dmDraw(MyObject obj);
引数ã®ã‚ªãƒ–ジェクトobjã‚’æç”»ã™ã‚‹ï¼Ž
- void dmInit()ï¼›
- ソースコード
- 次ã«ã€è©³ã—ã„コメントã®ã¤ã„ãŸã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚main関数ã‹ã‚‰èªã‚“ã§ãã ã•ã„。
/* step4 リンゴ(林檎)ã®è½ä¸‹  */ #include "dm4.h" dmObject apple; // リンゴ void simLoop(int pause) /*** シミュレーションループ ***/ { dmSimStep(); // シミュレーションを1ステップ進ã‚ã‚‹ dmDraw(apple); // ãƒªãƒ³ã‚´ã®æç”» } int main() /*** main関数 ***/ { double p1[3] = {0.0, 0.0, 2.0}; // ä½ç½® [m] double R[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢(回転行列) double red[3] = {1.0, 0.0, 0.0}; // 赤色 double r = 0.2, m = 1.0; // åŠå¾„[m],質é‡[kg] dmInit(); // åˆæœŸåŒ– dmCreateSphere(&apple, p1, R, m, r, red); // çƒã®ä½œæˆ dmLoop(800, 600, simLoop, NULL); // ウインドウã®å¹…,高, ループ関数,コマンド関数 dmClose(); // çµ‚äº†å‡¦ç† return 0; } - ã“れã¯èµ¤ã„玉ã®è‡ªç”±è½ä¸‹ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã™ã€‚ã¾ãšã€dmInit()ã§ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚
- 次ã«ç‰©ä½“を作りã¾ã™ï¼Žçƒã‚’作るAPIã¯dmCreateSphere()ã§ã™ï¼Ž
- 物体ã®ç”ŸæˆãŒçµ‚ã‚ã£ãŸã‚‰ã€æ¬¡ã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’1ステップ進ã‚ã¾ã™ã€‚dmLoop()ã®ä¸èº«ã¯whileループã«ãªã£ã¦ã„ã¦ã€ç¹°ã‚Šè¿”ã—simLoop関数ãŒå‘¼ã³å‡ºã—ã¦ã„ã¾ã™ã€‚dmLoop()ã®ä¸€ç•ªæœ€å¾Œã®å¼•æ•°ãŒNULLã«ãªã£ã¦ã„ã‚‹ã®ã¯ã€ã“ã®ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã§ã¯ã‚ーæ“作å¯èƒ½ãªcommand関数ãŒãªã„ã‹ã‚‰ã§ã™ã€‚å‰å›žã®ä¾‹ã®ã‚ˆã†ã«command関数ãŒã‚ã‚‹å ´åˆã¯NULLã®ä»£ã‚りã«commandを入れã¦ãã ã•ã„。
- ãŠæ¬¡ã¯ç‰©ä½“ã®æç”»ã§ã™ï¼ŽdmDraw(apple)ã§è½ä¸‹ã™ã‚‹çƒã‚’表示ã—ã¦ã„ã¾ã™ã€‚dmDraw()ã®å¼•æ•°ã¯è¡¨ç¤ºã—ãŸã„物体をã„れã¦ãã ã•ã„。
- 最後ã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’dmClose()ã§çµ‚了ã—ã¾ã™ï¼ŽãªãŠã€å°æ–‡å—ã®dmã§å§‹ã¾ã‚‹é–¢æ•°ã¯ç§ãŒã“ã®è¬›ç¾©ç”¨ã«ODEã®API(application interface)ã‚’å…ƒã«ä½œæˆã—ãŸã‚‚ã®ã§ã™ï¼Ž
- step4-100709.zipをダウンãƒãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—よã†ï¼
- 次ã®APIを使ã„é’ã„ボックスをä½ç½®p[3]={0.0, 1.0, 2.0}ã«ä½œæˆã—,è½ä¸‹ã•ã›ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を作ã£ã¦ãã ã•ã„.
- void dmCreateBox(dmObject *obj, double p[3], double R[12], double m, double side[3], Â double color[3]);
- 物体 obj, ä½ç½®ã€€p[3],  姿勢(回転行列)R[12],  質é‡ã€€m, サイズ(x,y,z) side[3], 色 color[3]
- ãªãŠã€å›žè»¢è¡Œåˆ—ã¯3×3行列ã§ã™ãŒã€ODEã§ã¯é«˜é€ŸåŒ–ã®ãŸã‚ã«3×4行列ã¨ã—ã¦å„è¡Œã®æœ€å¾Œã«0ã‚’è¿½åŠ ã—ã¦ã„ã¾ã™ã€‚
- 今度ã¯ç·‘色ã®å††æŸ±ã‚’ä½ç½®(0.0, -1.0, 2.0)ã«ä½œæˆã—,è½ä¸‹ã•ã›ãªã•ã„.
- void dmCreateCylinder(dmObject *obj, double p[3], double R[12], double m, double r, double l, double color[3]);
- 物体 obj, ä½ç½®ã€€p[3],  姿勢 R[12],  サイズ sides[3], åŠå¾„ r, é•·ã• l, 質é‡ã€€m, 色 color[3]
- 最後ã«ï¼Œé»„色ã®ã‚«ãƒ—セルをä½ç½®(-1, 0, 2)ã«ä½œæˆã—,è½ä¸‹ã•ã›ãªã•ã„.
- dBodyID Â dmCreateCapsule(dmObject *obj, double p[3], double R[12], double m, double r, double l, double color[3]);
- 物体 obj, ä½ç½®ã€€p[3],  姿勢 R[12],  サイズ sides[3], åŠå¾„ r, é•·ã• l, 質é‡ã€€m, 色 color[3]
