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

2010-07-08
By
è½ä¸‹ã™ã‚‹èµ¤ã„çƒ

è½ä¸‹ã™ã‚‹èµ¤ã„çƒ

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ã‚’æç”»ã™ã‚‹ï¼Ž
  • ソースコード
      次ã«ã€è©³ã—ã„コメントã®ã¤ã„ãŸã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚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)ã‚’å…ƒã«ä½œæˆã—ãŸã‚‚ã®ã§ã™ï¼Ž
  • ホームワーク
    1. step4-100709.zipをダウンロードã—ã¦å®Ÿè¡Œã—よã†ï¼
    2. 次ã®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を追加ã—ã¦ã„ã¾ã™ã€‚
    3. 今度ã¯ç·‘色ã®å††æŸ±ã‚’ä½ç½®(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]
    4. 最後ã«ï¼Œé»„色ã®ã‚«ãƒ—セルをä½ç½®(-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]


コメントをã©ã†ãž

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

433 views  (Since 2010-08-11)