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

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

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

【2-5-1】重力による斜方投射運動における初速度の分解にて導入した初期値を用いて、斜方投射運動のシミュレーションを行います。初速度 v_0[m/s]を固定したまま、投射角度θを変更します。 θ= 0°~ 90°まで、10°刻みで変えて投射するシミュレーションを行ないます。 当然、角度によって v_{x0}と v_{z0}とが変わり運動の様子が変化しますが、 それぞれ z軸方向の等加速度直線運動と、x軸方向の等速直線運動であることは変わりません。

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

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

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

//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;     //時刻
double dt= 0.03;    //時間刻み
int tn = 0;         //ステップ数
double g = 9.80665; //重力加速度 g
double degree;      //角度:度(°)
double radian;      //角度:ラジアン(rad)
double v0=40.0;     //初速度

// ボールの定義
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++ ){
    degree = 10.0 * double(i);        //度数法で表現
    radian = 2.0 * PI * degree/360.0; //弧度法への変換
    ball[i].x  = -50.0;
    ball[i].y  = 0.0;
    ball[i].z  = 0.0;
    ball[i].vx = v0 * sin(radian);
    ball[i].vy = 0.0;
    ball[i].vz = v0 * cos(radian);
    ball[i].ay = 0.0;
    ball[i].az = -g;
  }
}

ボールを10個用意して、それぞれの投射角度を10°ずつ変更します。

計算と物体の描画

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, &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} を設定することでシミュレーションすることができます。

20100127-01.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 トップ