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

2009-06-26
By

ODE

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)ï¼›
    • シミュレーションを引数stepsieze[s]ã ã‘1ステップ進ã‚ã¾ã™ã€‚stepsizeã¯æ•°å€¤ç©åˆ†ã®æ™‚間刻ã¿å¹…ã€å˜ä½ã¯ç§’。大ãã„ã¨ç²¾åº¦ãŒæ‚ªããªã‚Šã¾ã™ãŒã€ã‚¹ãƒ”ードã¯é…ããªã‚Šã¾ã™ã€‚

    • void dWorldQuickStep(dWorldID, dReal 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ã§å§‹ã¾ã‚‹é–¢æ•°ã¯ç§ã®ä½œæˆã—ãŸé–¢æ•°ã§ã™ï¼Ž

      ã“ã“ã§ã¯é‡åŠ›åŠ é€Ÿåº¦ã‚’èµ¤çŽ‰ãŒã‚†ã£ãりè½ä¸‹ã—ã¦ã„ãã¾ã™ãŒã€ãªã‚“ã¨åœ°é¢ã‚’通り抜ã‘ã¦æ¶ˆãˆã¦ã—ã¾ã„ã¾ã™ã€‚実ã¯ä¸Šã®ãƒ—ログラムã«ã¯è¡çªæ¤œå‡ºæ©Ÿèƒ½ãŒçµ„ã¿è¾¼ã¾ã‚Œã¦ã„ãªã‹ã£ãŸã®ã§ã™ã€‚

  • ホームワーク
    1. step4-090626.zipをダウンロードã—ã¦å®Ÿè¡Œã—よã†ï¼
    2. ODE本を読んã§ï¼Œãƒœãƒƒã‚¯ã‚¹ï¼ˆç›´æ–¹ä½“)をè½ä¸‹ã•ã›ã‚ˆï¼
    3. ODE本を読んã§ï¼Œå††æŸ±ã‚’è½ä¸‹ã•ã›ã‚ˆï¼
    4. ODE本を読んã§ï¼Œã‚«ãƒ—セルをè½ä¸‹ã•ã›ã‚ˆï¼
    5. 上ã§ä½œæˆã—ãŸãƒ—ログラムã®ä¸­ã§çƒã‚’作るã¨ã“ã‚を関数化ã—ãªã•ã„.引数ã¨ã—ã¦ä½ç½®ï¼Œå§¿å‹¢ï¼Œç‰©ä½“生æˆã«å¿…è¦ãªãƒ‘ラメータを使ã†ã“ã¨ï¼Ž
      • dBodyID  dmCreateSphere(double p[3],  double  R[12],  double  r , double m);
      • ä½ç½®ã€€p[3],  姿勢 R[12],  åŠå¾„ r,  質é‡ã€€m
    6. åŒæ§˜ã«ãƒœãƒƒã‚¯ã‚¹ã®ç”Ÿæˆã‚’関数化ã—ãªã•ã„.
      • dBodyID  dmCreateBox(double p[3], double R[12], double sides[3], double m);
      • ä½ç½®ã€€p[3],  姿勢 R[12],  サイズ sides[3], åŠå¾„ r,  質é‡ã€€m
    7. 円柱ã®ç”Ÿæˆã‚’関数化ã—ãªã•ã„.
      • dBodyID  dmCreateCylinder(double p[3], double R[12], double l, double r, double  m, int dir);
      • ä½ç½®ã€€p[3],  姿勢 R[12],  åŠå¾„ r,  質é‡ã€€m, Â é•·è»¸ã®æ–¹å‘ dir
    8. カプセルã®ç”Ÿæˆã‚’関数化ã—ãªã•ã„.
      • dBodyID  dmCreateCapsule(double p[3], double R[12], double l,  double r);
      • ä½ç½®ã€€p[3],  姿勢 R[12],  åŠå¾„ r,  質é‡ã€€m, Â é•·è»¸ã®æ–¹å‘ dir




コメントをã©ã†ãž

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

1,498 views  (Since 2010-08-11)