Last updated: 2016 -2014. Kajiyama                    [ 目次に戻る ]

ベクトルを使いボールの落下運動を表現する


  1. Processing はベクトルを落下運動に利用する

    1. Processing ではPVector がベクトルで position(位置),velocitiy(速度),acceleration(加速度), 減速率(deceleration)を表す

      ・高校の復習 速さ(スカラー)と速度(ベクトル)

      ・高校の復習 等速直線運動  ・ 等加速度直線運動

      ・リファレンス ベクトルのクラス解説
      PVector クラスの機能ベクトルの計算メソッドを準備している
      ユークリッド幾何のベクトル
      ベクトルx成分:
      ベクトルy成分:
      PVector 変数名;
       変数名.x
       変数名.y
      ベクトル足し算add();
      ベクトル引き算sub();
      ベクトルをスカラー倍mult();
      ベクトルをスカラーで割るdiv();
    2. ベクトルで速度・加速度運動シミュレーションの解説

      ・ボールに力を加えない限り,ボールは静止状態を続け、動いているボールは等速直線運動を続ける.(運動の第1法則)

      ・ボールに力を加えると加速度が生じる.(運動の第2法則) 力 = 質量 X 加速度, 加速度 = 力/質量

      1章 ベクトル,"The Nature of Cord 自然現象のシミュレーション入門",Daniel Shiffman,岡利崇訳,ボーンデジタル,p23-52, 2014.

      2章 力,"The Nature of Cord 自然現象のシミュレーション入門",Daniel Shiffman,岡利崇訳,ボーンデジタル,p53-84, 2014.


  2. 落下するボールの等速直線運動と落下位置(鉛直位置)の変化  ここではアニメーションの1秒間を60フレームで作成する.

    ・まず,重力の影響を無視した,ボールが同じ速さで真直ぐ落下する「等速直線運動」のシミュレーションを考える.

     (1) 位置(position)と速度(velocitiy)の関係

     Processingのフレームが変わるたびに,速度はボールの位置を変えていく.1ピクセル = 1m,1フレーム = 1/60秒


     1/60 秒間隔の1フレームで考えると,

     速度ベクトルの設定 初速度300 (m/s),下向き90゜方向: この初速度を1フレーム = 1/60 秒で換算すると,

     1/60 秒間の1フレームのx成分 velocitiy.x= 0.0/60 (m/s) と y成分 velocitiy.y= 300.0/60 (m/s)



     1フレーム後の現在の位置(position)=以前の位置(position)+速度(velocitiy) //position.add(velocitiy);

     内容は position.x = position.x + velocitiy.x, position.y = position.y + velocitiy.y


    ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

    ソースファイル
    //落下するボールの等速直線運動と位置の変化(1フレーム 1/60秒) //ボールの位置変数のベクトル宣言 変数 position.x と position.y を定義 PVector position; //ボールの速度変数のベクトル宣言 変数 velocitiy.x と velocitiy.y を定義 PVector velocitiy; void setup() { //初期設定 size(200,800);//キャンバスのサイズは200mX800mを想像してください? background(255); position = new PVector(width/2, 20);//最初の位置(x,y) velocitiy = new PVector(0.0/60, 300.0/60);//初速度(x,y)の定義 } void draw() { // 速度による新しい位置(x,y)の計算 position.add(velocitiy);//新しい位置=以前の位置+速度 //図形の軌跡をグラデーションで残す fill(255,20); noStroke(); rect(0,0,width,height);//塗りつぶし stroke(255,0,0); fill(255,0,0);//線色を赤・面色を赤 ellipse(position.x, position.y,40,40);//新しい位置にボールを描く // ボールが下端に達したら上端に戻し継続して表示 if(position.y+20 > height){ position.y = 10; } //save("vector_ellipse02a-1.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse02a-###.tif");// 連続画像で保存 }
    実行結果


  3. 落下するボールに加わる重力による,等加速度直線運動と落下位置(鉛直位置)の変化

    ・ボールが重力加速度を受けながら速度を増す落下シミュレーションを考える.空気抵抗があり減速があるがここでは無視する.

    ・ボールに力(重力)を加えると加速度が生じる.(運動の第2法則)

     力 = 質量 X 加速度, 加速度 = 力/質量, 質量 = 1 とすると加速度 = 力

     重力加速度を使用する.gravity(重力加速度) =9.8 (m/s2)


     (1) 速度(velocitiy)と加速度(acceleration)の関係  ここではアニメーションの1秒間を60フレームで作成する.

     Processingのフレームが変わるたびに,加速度はボールの速度を変えていく.1ピクセル = 1m,1フレーム = 1/60秒


     1/60秒間隔の1フレームに換算する.

     速度ベクトルの設定 初速度 0.0/60 (m/s): x成分 velocitiy.x= 0.0/60 (m/s) と y成分 velocitiy.y= 0/60 (m/s)


     加速度ベクトルの設定 重力加速度 9.8/60 (m/s2): x成分 gravity.x= 0.0/60 (m/s2) と y成分 gravity.y= 9.8/60 (m/s2)

     x方向の加速度は,1フレーム間に速度を0.0/60 (m/s)増す.

     y方向の加速度は,1フレーム間に速度を9.8/60 (m/s)増す.



     1フレーム後の現在の速度(velocitiy)=以前の速度(velocitiy)+加速度(gravity) //velocitiy.add(gravity);

     内容は velocitiy.x = velocitiy.x + gravity.x,velocitiy.y = velocitiy.y + gravity.y


     (2)位置(position)と速度(velocitiy)の関係  ここではアニメーションの1秒間を60フレームで作成する.

     Processingのフレームが変わるたびに,速度はボールの位置を変えていく.1ピクセル = 1m,1フレーム = 1/60秒

     1フレーム後の現在の位置(position)=以前の位置(position)+速度(velocitiy) //position.add(velocitiy);

     内容は position.x = position.x + velocitiy.x, position.y = position.y + velocitiy.y


    ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

    ソースファイル
    //落下するボールに加わる重力加速度と位置の変化(1フレーム 1/60秒) //ボールの位置変数のベクトル宣言 変数 position.x と position.y を定義 PVector position; //ボールの速度変数のベクトル宣言 変数 velocitiy.x と velocitiy.y を定義 PVector velocitiy; //ボールの重力加速度変数のベクトル宣言 変数 gravity.x とgravity.y を定義 PVector gravity; void setup() { //初期設定 size(200,800); background(255); position = new PVector(width/2, 20);//最初の位置(x,y) velocitiy = new PVector(0.0/60, 0.0/60);//初速度(x,y)の定義 gravity = new PVector(0.0/60, 9.8/60);//重力加速度(x,y)の定義 } void draw() { // 加速度による新しい速度(x,y)の計算 velocitiy.add(gravity);//現在の速度=以前の速度+重力加速度 // 速度による新しい位置(x,y)の計算 position.add(velocitiy);//新しい位置=以前の位置+速度 //図形の軌跡をグラデーションで残す fill(255,20); noStroke(); rect(0,0,width,height);//塗りつぶし stroke(255,0,0); fill(255,0,0);//線色を赤・面色を赤 ellipse(position.x, position.y,40,40);//新しい位置にボールを描く // ボールが下端に達したら上端に戻し継続して表示 if(position.y+20 > height){ position.y = 10; } //save("vector_ellipse02a-2.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse02a-###.tif");// 連続画像で保存 }
    実行結果


  4. ボールの自由落下を減速率(空気抵抗)により減速する

    ・ボールが重力加速度を受けながら落下速度を増し,かつ,空気抵抗により減速する落下シミュレーションを考える.

    (1) 現在の速度(velocitiy)=以前の速度(velocitiy)+加速度(gravity)

    (2) さらに,空気抵抗により,現在の速度(velocitiy)=以前の速度(velocitiy)*減速率(deceleration)

      velocitiy.mult(deceleration.y); 掛け算 velocitiy.y = velocitiy.y * deceleration.y

    (3) 現在のフレームの位置(position)=以前のフレームの位置(position)+現在の速度(velocitiy)


    ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

    ソースファイル
    //落下するボールの速度と減速率と位置の変化(1フレーム 1/60秒) //ボールの位置変数のベクトル宣言 変数 position.x と position.y を定義 PVector position; //ボールの速度変数のベクトル宣言 変数 velocitiy.x と velocitiy.y を定義 PVector velocitiy; //ボールの重力加速度変数のベクトル宣言 変数 gravity.x とgravity.y を定義 PVector gravity; //減速率のベクトル宣言 変数 deceleration.x と deceleration.y を定義 PVector deceleration; void setup() { //初期設定 size(200,800);background(255); deceleration = new PVector(0.0, 0.99);//減速率の定義(x,y) position = new PVector(width/2, 20);//最初の位置(x,y) velocitiy = new PVector(0.0/60, 0.0/60);//初速度(x,y)の定義 gravity = new PVector(0.0/60, 9.8/60);//重力加速度(x,y)の定義 } void draw() { // 加速度による新しい速度1(x,y)の計算 velocitiy.add(gravity);//現在の速度=以前の速度+重力加速度 // 減速率による新しい速度2(x,y)の計算 velocitiy.mult(deceleration.y);//現在の速度=以前の速度*減速率 // 速度による新しい位置(x,y)の計算 position.add(velocitiy);//新しい位置=以前の位置+速度 //図形の軌跡をグラデーションで残す fill(255,20); noStroke(); rect(0,0,width,height);//塗りつぶし stroke(255,0,0); fill(255,0,0);//線色を赤・面色を赤 ellipse(position.x, position.y,20,20);//新しい位置にボールを描く // ボールが下端に達したら上端に戻し継続して表示 if(position.y+10 > height){ position.y = 10;; } //save("vector_ellipse02a-3.jpg");// 実行結果を画像形式で保存 //saveFrame("vector_ellipse02a-###.tif");// 連続画像で保存 }
    実行結果

[ 目次に戻る ]