ODEã§å¦ã¶C言語2 [STEP5: æ§‹é€ ä½“]
ODEã§å¦ã¶C言語2ã®Step5ã§ã™ï¼Žä»Šå›žã¯æ§‹é€ 体ã¨ç‰©ä½“ã¸åŠ›ã‚„ãƒˆãƒ«ã‚¯ã‚’åŠ ãˆã‚‹æ–¹æ³•,ã•らã«ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒªã‚»ãƒƒãƒˆæ³•ãªã©ã‚’å¦ã³ã¾ã™ï¼Žæ§‹é€ ä½“ã®æ¦‚è¦ã«ã¤ã„ã¦ã¯æ—¢ã«ã‚ã‹ã£ã¦ã„ã‚‹ã‚‚ã®ã¨ã—,サンプルコードを示ã™ã“ã¨ã«ã‚ˆã‚Šå…·ä½“çš„ãªä½¿ã„方をå¦ã³ã¾ã™ï¼Ž
â—‹ã€€æ§‹é€ ä½“
é…列ã§ã¯åŒã˜åž‹ã—ã‹ã¾ã¨ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸãŒï¼Œæ§‹é€ 体ã§ã¯é•ã†åž‹ã‚’ã¾ã¨ã‚ã¦æ‰±ã†ã“ã¨ãŒã§ãã‚‹ã®ã§ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ç‰©ä½“ã«å¤šãã®å±žæ€§ãŒã‚ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™ï¼Žã“ã®ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ ã§ã¯ç‰©ä½“ã‚’dmObjectã¨ã„ã†æ§‹é€ ä½“ã§æ¬¡ã®ã‚ˆã†ã«è¡¨ã—ã¦ã„ã¾ã™ï¼Ždm5.hã®ï¼‘6行目ã«å®šç¾©ã—ã¦ã„ã¾ã™ï¼Žä»Šå›žã®ä¾‹ã¯ãƒ‰ãƒŸãƒŽå€’ã—ãªã®ã§ï¼Œã“ã®æ§‹é€ 体を元ã«ãƒ‰ãƒŸãƒŽã‚’21個生æˆã—ã¦ã„ã¾ã™ï¼Ž
typedef struct{
dBodyID body; // ボディã®ID
dGeomID geom; // ジオメトリã®ID
const double *p; // x, y, z [m]
const double *R; // 回転行列 è¦ç´ æ•°4x3
double m; // è³ªé‡ [kg]
double r,l; // åŠå¾„ [m], é•·ã• [m]
const double *side; // サイズ x,y,z
const double *color; // 色 r,g,b
} dmObject;
â—‹ å§¿å‹¢ã®å¤‰æ›´
物体ã®å§¿å‹¢ã‚’変更ã™ã‚‹ãŸã‚ã«ã¯æ¬¡ã®APIを使ã„回転行列Rã®å€¤ã‚’変更ã—ã¾ã™ï¼Žã“ã“ã§ï¼ŒRã¯å›žè»¢è¡Œåˆ—ãŒæ ¼ç´ã•れã¦ã„ã‚‹é…列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ï¼Œax, ay, axã¯å›žè»¢è»¸ãƒ™ã‚¯ãƒˆãƒ«ï¼Žangleã¯å›žè»¢è§’度ã¨ãªã‚Šã¾ã™ï¼ŽãªãŠï¼Œdã ã‘ã§å§‹ã¾ã‚‹APIã¯ODEã®APIã§ã™ï¼Ž
- dRFromAxisAndAngle(double R[12], double  ax, doulbe  ay, double  az, double angle);
○ 力,トルクã®åŠ ãˆæ–¹
- void dmAddForce(dmObject *obj, double fx, double fy, double fz)
- 物体objã®é‡å¿ƒã«åŠ›(fx,fy,fz)ã‚’åŠ ãˆã‚‹
- void dmAddTorque(dmObject *obj, double fx, double fy, double fz)
- 物体objã®é‡å¿ƒã«ãƒˆãƒ«ã‚¯(fx, fy, fz)ã‚’åŠ ãˆã‚‹ï¼Žfx,fy,fzã¯ãれãžã‚Œx, y, z軸ã¾ã‚りã®ãƒˆãƒ«ã‚¯
○ 高速ãªã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³
å‰å›žã®ã‚µãƒ³ãƒ—ルã§ã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒ†ãƒƒãƒ—関数ã¨ã—ã¦dmSimStep()を使ã„ã¾ã—ãŸãŒï¼Œã“ã“ã§ã¯ã‚ˆã‚Šé«˜é€ŸãªdmSimQuickStep()を使ã„ã¾ã™ï¼ŽãŸã ã—,dmSimStep()ã¨æ¯”較ã—ã¦ç²¾åº¦ãŒæ‚ªããªã‚Šã¾ã™ï¼Ž
○ シミュレーションã®ãƒªã‚»ãƒƒãƒˆ
rã¾ãŸã¯Rã‚ーを押ã™ã¨ï¼ŒresetSim関数ãŒå‘¼ã°ã‚Œã¦ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒãƒªã‚»ãƒƒãƒˆã•れã¾ã™ï¼ŽresetSimã®ä¸èº«ã¯ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ«ãƒ¼ãƒ—ãŒï¼‘回以上呼ã³å‡ºã•れãŸã¨ãã«dmInit関数を呼ã³å‡ºã—ã¦åˆæœŸåŒ–ã—,ドミノをå†åº¦ç”Ÿæˆã—ã¦ã„ã¾ã™ï¼Ž
○ ソースコード
/* step5 ドミノ倒㗠 */
#include "dm5.h"
#define DOMINO_NUM 21
static int STEPS = 0; // シミュレーションã®ã‚¹ãƒ†ãƒƒãƒ—æ•°
double red[3] = {1.3, 0.0, 0.0}; // 赤色
dmObject domino[DOMINO_NUM]; // ドミノ
void simLoop(int pause) /*** シミュレーションループ ***/
{
int i;
double x = 5.0, y = 0, z = 1; // カメラã®ä½ç½®[m]
double yaw = -180, pitch = 0, roll = 0; // カメラã®å§¿å‹¢ã€€ãƒ¨ãƒ¼ï¼Œãƒ”ッãƒï¼Œãƒãƒ¼ãƒ«è§’[°]
if (STEPS == 0) dmSetCamera(x,y,z,yaw,pitch,roll); // カメラã®è¨å®š
dmSimQuickStep(); // シミュレーションを1ステップ進ã‚ã‚‹(高速版)
for (i = 0; i < DOMINO_NUM; i++)
{
dmDraw(&domino[i]); // å£ã®æç”»
}
STEPS++;
}
void resetSim(int n)
{
double m = 0.1; // 質é‡
double side[3] = {0.2, 0.05, 0.5}; // サイズ
double R[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // å§¿å‹¢
double p[DOMINO_NUM][3]; // ä½ç½®
int i;
// シミュレーションã®çµ‚了
if (STEPS != 0)
{
dmClose();
}
dmInit(); // åˆæœŸåŒ–
// ドミノã®ç”Ÿæˆ
for (i = 0; i < DOMINO_NUM; i++)
{
p[i][2] = 0.25; // ドミノé‡å¿ƒã®z座標
switch (n)
{
case 0:
p[i][0] = 0; // ドミノé‡å¿ƒã®x座標
p[i][1] = 0.3 * i -3.0; // ドミノé‡å¿ƒã®y座標
break;
case 1:
p[i][0] = 0.3 * i -3.0;
p[i][1] = p[i][0];
// z軸周りã«Ï€/4回転ã•ã›ãŸå§¿å‹¢
dRFromAxisAndAngle(R, 0, 0, 1, - M_PI/4);
break;
default:
printf("Bad number \n");
break;
}
dmCreateBox(&domino[i], p[i], R, m, side, red);
}
}
void command(int cmd)
{
switch (cmd)
{
case '1':
resetSim(1);
break;
case 'r':
case 'R':
resetSim(0);
break;
case 'f':
case 'F':
{
double fx = -1.0, fy = 0.0, fz = 0.0;
dmAddTorque(&domino[0], fx, fy, fz); // x,y,z軸ã¾ã‚りã«fx,fy,fzã®ãƒˆãƒ«ã‚¯ã‚’付åŠ
break;
}
default:
printf("Input r, R, f, F key \n");
break;
}
}
/*** main関数 ***/
int main()
{
resetSim(0); // シミュレーションã®ãƒªã‚»ãƒƒãƒˆ
dmLoop(800, 600, simLoop, command); // ウインドウã®å¹…,高, ループ関数,コマンド関数
dmClose(); // 終了
return 0;
}
ホームワーク
- サンプルコードstep5-100720.zipã‚’ã“ã“ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¦å®Ÿè¡Œã—よã†ï¼Ž
- ドミノを X状ã«é…ç½®ã—ã¦ï¼Œãƒ‰ãƒŸãƒŽå€’ã—ã‚’ã—ãªã•ã„.  解ç”例step5b-100726.zip
- ドミノをåŠå¾„ï¼’ï½ã®å††ä¸Šã«é…ç½®ã—ã¦ï¼Œãƒ‰ãƒŸãƒŽå€’ã—ã‚’ã—ãªã•ã„
- 上ã®é…ç½®ã§ãƒ‰ãƒŸãƒŽå€’ã—ãŒç„¡é™ã«ç¶šãよã†ã«ï¼Œãƒ‰ãƒŸãƒŽãŒã²ã¨ã‚Šã§ã«èµ·ã上ãŒã‚‹ã‚ˆã†ã«ã—ãªã•ã„.
