HOME > natural science Laboratory > コンピュータ・シミュレーション講座 > 仮想物理実験室

VisualC++ と OpenGL を利用した仮想物理実験室
【2-4-1】重力による水平投射運動のシミュレーション

文責:遠藤 理平 (2010年8月29日) カテゴリ:仮想物理実験室(247)

【2-3】重力による運動:水平投射運動では、【2-1-2】重力による運動のアルゴリズムの導出で導出したニュートンの運動方程式を用いて、初期値として x 方向の初速度 v_{x0} 設定することで、水平投射運動をシミュレーション行ないましました。 今回は、斜方投射運動と呼ばれる運動をシミュレーションします。

(2.4-1)
時刻 t=tn[s] におけるニュートンの運動方程式

重力による運動は、上記のアルゴリズムと t=t_0[s]のときの状態、初期値を適切に設定することですべての運動を表現することができます。初期値として、v_{x0}を設定することで水平投射運動をシミュレーションしました。さらに異なった初期値に対する運動のシミュレーションを行ないます。

斜方放射運動

斜方放射運動とは、ボールを斜めに投射する運動をさします。 斜めに投射することは、初期値として z軸方向(鉛直方向)の初速度 v_{z0}と、x軸方向(水平方向)の初速度 v_{x0}を設定することです。つまり、z軸方向の鉛直投射運動と x軸方向の水平投射運動を組み合わせた運動となります。

斜方放射運動の図

上記の図では、初速度として z軸方向には v_{z0}、x軸方向には v_{x0}を与えたときの様子を表しています。ボールは斜め上の方向への初速度となります。つまり、中学生で学習する三平方の定理を適用することで、初速度の大きさを計算することができます。

(9-2)
初速度の計算

また、一般的に初速度をベクトルは

(9-3)
初速度のベクトル表記

と表現でます。また、初速度の大きさはベクトルの大きさで表すことができます。

(9-4)
初速度のベクトル表記

これも中学生で学習する3次元版の三平方の定理と同じで、3つの辺の長さが v_{x0} v_{y0} v_{z0} の直方体の対角線の長さとなります。「|~|」の記号は、中学生学習する絶対値と意味で、この場合、3次元ベクトルの大きさを表します。 中学生では、実数の絶対値(例えば |-4.2|= 4.2 )について学習しますが、これは単に「-(マイナス)」を消すという操作ではなく、実数も、実数軸方向の1次元のベクトルと考えることができるので、2乗してルートをとるという操作を行なった結果です。

位置・速度・加速度の初期値(斜方放射運動)

g = 9.80665 //重力加速度
// 位置・速度・加速度の初期値 
x = -50.0;
y =   0.0;
z = 0.0;
vx = 10.0; //<---------------x軸方向の初期速度を設定
vy = 0.0;
vz = 40.0; //<---------------z軸方向の初期速度を設定
ax = 0.0;
ay = 0.0;
az = -g;  //重力

斜方放射運動のシミュレーション

z軸方向の初速度 v_{z0}を 40[m/s]と固定したまま、 x軸方向の初速度 v_{x0}を 0~20[m/s]まで変化させてシミュレーションします。 v_{z0}は一定なので、すべてのボールは同じ高さまで上がり、重力によりすべてのボールは等加速度直線運動することが確認できます。 また x軸方向には v_{x0} の大きさに応じて等速直線運動することもわかります。

VisualC++ + OpenGL プログラミング

【2-3】重力による運動:水平投射運動の初期値を変更することで、斜方投射運動のシミュレーションを行ないます。

仮想物理実験室変数の定義

//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;  //時刻
double dt= 0.03; //時間刻み
int tn = 0;      //ステップ数
double g = 9.80665; //重力加速度 g

// ボールの定義
struct BALL {
  double x, y, z;
  double vx, vy, vz;
  double ax, ay, az;
};
const int N = 11;//<--------------------- ボールの個数を設定
BALL ball[N];
void SetUp(void){
  for(int i=0; i<N; i++ ){
    ball[i].x  = -50.0;
    ball[i].y  = 0.0;
    ball[i].z  = 0.0;
    ball[i].vx = 2.0*double(i);//<-----------vx の値を変化させる
    ball[i].vy = 0.0;
    ball[i].vz = 40.0;
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = -g;
  }
}

ボールの個数を簡単に変化させることとができるように、 ボールの個数を意味する変数 N としました。今回は N=11 としました。

計算と物体の描画

void Calculate(){
  t = dt * double(tn);
  for(int i=0; i<N; i++){
    //速度の算出
    ball[i].vx = ball[i].vx + ball[i].ax * dt;
    ball[i].vy = ball[i].vy + ball[i].ay * dt;
    ball[i].vz = ball[i].vz + ball[i].az * dt;
    //位置の算出
    ball[i].x = ball[i].x + ball[i].vx * dt;
    ball[i].y = ball[i].y + ball[i].vy * dt;
    ball[i].z = ball[i].z + ball[i].vz * dt;
  }
 tn++;
}
void DrawStructure(){
  for(int i=0; i<N; i++){
    glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_ruby.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_ruby.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_ruby.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &amp;ms_ruby.shininess);
      glTranslated(ball[i].x, ball[i].y, ball[i].z); //平行移動値の設定
      glutSolidSphere(4.0, 20, 20);            //引数:(半径, Z軸まわりの分割数, Z軸に沿った分割数)
    glPopMatrix();
  }
}

i 番目のボールの 位置「ball[i].x」「ball[i].y」「ball[i].z」
速度「ball[i].vx」「ball[i].vy」「ball[i].vz」
加速度「ball1.ax」「ball[i].ay」「ball[i].az」
を逐次計算します。水平方向には等速直線運動、鉛直方向(z軸方向)には、重力による等加速度直線運動を行ないます。初期値として、v_{z0}と v_{x0} を設定することでシミュレーションすることができます。

20100118-05.gif

VisualC++ と OpenGL を利用した仮想物理実験室

第0章 仮想物理実験室の構築

第1章 様々な運動

第2章 ニュートンの運動方程式

第3章 剛体の運動(エネルギー保存則と運動量保存則)

付録

  • 【A-1】参考文献
    ・(A-1-1)OpenGL について
    ・(A-1-2)VisualC++ について
    ・(A-1-3)物理シミュレーション
    ・(A-1-4)数値計算

未分類

力学

量子力学

波動論



▲このページのトップNPO法人 natural science トップ

関連記事

仮想物理実験室







▲このページのトップNPO法人 natural science トップ