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

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

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

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

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

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

水平放射運動

水平放射運動とは、水平方向(x軸方向)に初速度 v_{x0}を与えたときの運動をさします。 鉛直方向には、重力がかかっているので、加速度的に落下します。

水平投射運動の図

位置・速度・加速度の初期値(水平投射運動)

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

水平投射運動のシミュレーション

x軸方向の初速度 v_{x0}を 0~40[m/s]まで変化させてシミュレーションしました。重力により、すべてのボールは同じ加速度で落下することが確認できます。

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

【7日目】重力による運動:鉛直投射運動の初期値を変更することで、水平投射運動のシミュレーションを行ないます。

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

//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
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 = 10;  //<--------------------- ボールの個数を設定
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 = 100.0;
    ball[i].vx = 5.0*(i);//<-----------vx の値を変化させる
    ball[i].vy = 0.0;
    ball[i].vz = 0.0;
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = -g;
  }
}

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

計算と物体の描画

void Calculate(){
  t = dt * double(tn);
  for(int i=1; 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=1; 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_{x0} を設定することでシミュレーションすることができます。

20100113-1.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 トップ