Python

【Pyxel】Pythonで物理シミュレーションをしよう! Day 1 -自由落下-

pyxelで物理シミュレーション

こんにちは!

くるる
くるる
人気フクロウの”くるる”@kururu_owl だよー
はやぶさ
はやぶさ
現役エンジニアの”はやぶさ”@Cpp_Learningです

以前『Pythonでレトロゲームを作ろう!』シリーズの記事を書きました。

Pyxelでレトロゲームを作る 総集編
【Pyxel】Pythonでレトロゲームを作ろう! 総集編 -まるっと1週間でゲーム開発入門-Python向けのレトロゲームエンジン:pyxelを用いたゲーム開発入門チュートリアル(ソースコード付き)を書きました。画像処理・数学・物理・制御について学び、実践としてゲームプログラミングまで行います。...
くるる
くるる
レトロゲームエンジン”Pyxel”でゲーム作るの最高に楽しかった♪
くるる
くるる
また、Pyxelを使って何か勉強したーい

というフクロウが目の前にいるので…

『Pythonで物理シミュレーションをしよう!』シリーズの記事を書こうと思います。

くるる
くるる
やったー!!
はやぶさ
はやぶさ
楽しく物理シミュレーションを実践しましょう!

対象読者

Pyxelの使い方については、下記の記事で説明済みです。

Pyxelでレトロゲームを作る 総集編
【Pyxel】Pythonでレトロゲームを作ろう! 総集編 -まるっと1週間でゲーム開発入門-Python向けのレトロゲームエンジン:pyxelを用いたゲーム開発入門チュートリアル(ソースコード付き)を書きました。画像処理・数学・物理・制御について学び、実践としてゲームプログラミングまで行います。...
Pyxelって何?どうやって使うの?

という人は…

くるる
くるる
『Pythonでレトロゲームを作ろう!』シリーズの記事を先に読めば予習は完璧だよ!

本シリーズ記事ではPyxelの基本的な使い方よりも「物理シミュレーション」の説明に注力します。

なので、本シリーズは以下の読者を想定して書きます。

【対象読者】

  • Pythonで物理シミュレーションを学びたい人
  • 物理シミュレーションをアニメーションで可視化したい人
  • 数学・物理を学び、実践としてプログラミングまでしたい人
  • (Pyxelの基本的な使い方が分かる人)
くるる
くるる
楽しく学べる丁寧な説明よろ~

本シリーズでは「質点系の力学」を扱います。もっと複雑な物理シミュレーションを期待していた人には、ごめんなさい(今は力不足で書けないけど、いつかは…)

物理とは

ところで…

くるる
くるる
物理って何?
はやぶさ
はやぶさ
”くるる”ちゃん木から落ちたことがあるよね?
くるる
くるる
あるある!お昼寝してたら、落ちた!
はやぶさ
はやぶさ
なんで落ちたのかな?誰かに下から引っ張られたの?
くるる
くるる
くるる
近くには誰もいなかった…よね?
はやぶさ
はやぶさ
でも誰かに引っ張られてないなら、鳥は落ちないよね?飛べるし
くるる
くるる
くるる
まさか…地球が引っ張っていた!?なんちゃって♪
はやぶさ
はやぶさ
正解!地球…正確には重力が”くるる”ちゃんを引っ張っていたよー
くるる
くるる
わぉー

テーブルの上で静止するコップ、放物線を描く野球ボール、木から落ちるフクロウなど…あらゆる現象は「何らかの法則」に従って発現すると考えられています。

その「何らかの法則」を明らかにするのが”物理”という学問です。

力学とは

また、なぜ静止し続けるのか?なぜ動き続けるのか?なぜ木から落ちたのか?などを考えたとき…

「物体にどんな”力”が加わり、どんな運動をするのか?」という”力”に着目して現象を明らかにする学問が”力学”です。

くるる
くるる
じゃあ”くるる”が木から落ちたのは重力という”力”が加わったから落ちたと?

正解!

くるる
くるる
そして、重力によって”くるる”がどうやって落ちたか(どんな運動をしたのか)が物理(力学)を学べば分かると?

大正解!!”くるる”ちゃんは賢いなぁ

くるるドヤ顔してる”くるる”ちゃんが今日も可愛い(*・ω・)ノ♪

物理を勉強すると”目に映る何気ない現象”を見るのがちょっと楽しくなるかも?(Hello, Physical World!

スポンサーリンク

物理シミュレーションとは

閃いた!

くるる
くるる
くるる
物理を勉強しなくても、そのときの様子を再現すれば良いのでは?
はやぶさ
はやぶさ
ほう。つまり、再びあの高い木から飛び降りると?
くるる
くるる
くるる
怖い…(´;ω;`)
はやぶさ
はやぶさ
”くるる”ちゃん泣かないで!大丈夫だよ!そのための本記事”物理シミュレーション”だよ

「繰り返し実施することが困難な現象」や値段が高いなど「何らかの理由で用意することが困難な物体の運動」を観測する場合…

物体の運動方程式を考え、その運動方程式を用いてシミュレーションすることで、現実世界の現象(物体の運動)をバーチャルで観測することができます。

くるる
くるる
シミュレーションができれば、木から飛び降りなくて済む!運動方程式を勉強しないと!!

くるる泣き止んだ”くるる”ちゃんは勉強する気満々です!笑

  • 物体の現象を数式化(モデル化)して物理シミュレーションを行います
  • 物理シミュレーションにより、現実世界の現象を”再現”⇒”観測”することで、時間やコストを節約できます
  • 実際には危険を伴う現象でもバーチャルなので安全に観測できます

ニュートンの運動則

物理…運動方程式……シミュレーション……

くるる
くるる
くるる
難しそうだし、何から学べば良いのかな?

色んな勉強方法がありますが、今回は基礎から丁寧に学べるような説明にしますね(*・ω・)ノ♪

はやぶさ
はやぶさ
最初にニュートン(Newton)の運動則を確認しておきましょう
【ニュートンの運動則】
  1. 慣性の法則
    物体に力が加わらない限り、静止している物体は静止し続け、運動している物体は等速直線運動を続ける
  2. ニュートンの運動方程式
    物体に加わる力は、物体の運動量の時間的変化に等しいため、以下の式で表現できる
    F = m・a 
    ( 単位 : [N] = [kg]・[m/s^2] )
  3. 作用・反作用
    物体Aが物体BをFの力で押すとき、物体Aには-F(反対方向)の力が加わる
くるる
くるる
”ニュートンの運動方程式”がキーワードっぽい!

正解!どの法則も超重要だけど、今回は第二法則(ニュートンの運動方程式)がメインだね!

  • 自分に合った勉強方法を見つけて下さいね
  • ニュートンの運動則はどれも超重要です

ニュートンの運動方程式

ニュートンの運動方程式を私のなりの言葉で噛砕いて表現すると…

『質量m[kg]の物体に力F[N]が加わると、加速度a[m/s^2]が生じる』

となります。式変形すると分かりやすいです。

F = m・a ( 単位 : [N] = [kg]・[m/s^2] )

a = F / m ( 単位 : [m/s^2] = [N] / [kg] )

くるる
くるる
F = m・aの式は知ってたけど、あまり意味とか気にしてなかった…

数式の意味を理解することが重要だよ!

くるる無言の敬礼がカッコイイぞ!

数式の”成り立ち”や”意味”に興味を持ってほしい!

加速度・速度・位置の関係と微分積分

えーと…ニュートンの運動方程式によると…

くるる
くるる
3kgの箱に6Nの力を加えると、加速度2m/s^2で運動するってこと?

おしい!正確には”6Nの力を加え続けると”だね!

くるる
くるる
なるほど!加速度2m/s^2ってのがピンとこない…

加速度をグラフで表現すると以下のようになります。

加速度加速度が2というのは、時間が1s経過する毎に速度が2ずつ増加するという意味です。

つまり、速度と時間のグラフの傾きが加速度です。

そして、傾きは速度dvを微小時間dtで割った以下の式で表現できます。

a = dv / dt ( 単位 : [m/s^2] = [m/s] / [s] )

くるる
くるる
これって”微分”ってやつでしょ!

正解!

くるる
くるる
今まであまり”単位”って気にしてなかったけど…
くるる
くるる
単位から何を微分しているのかが分かるね

大正解!!

微積分
加速度・速度・位置の関係と微分
  • 位置を時間で微分したものが速度
      v = dx/dt ( 単位:[m/s] = [m] / [s] )
  • 速度を時間で微分したものが加速度
      a = dv/dt ( 単位 : [m/s^2] = [m/s] / [s] )

また、加速度は位置を二階微分したものとも言えますね。

同様に積分についても確認しておきましょう!

加速度・速度・位置の関係と積分
  • 加速度を積分したものが速度
      v = ∫a・dt  ( 単位:[m/s] = [m/s^2] * [s] )
  • 速度を積分したものが位置
      x = ∫v・dt  ( 単位 : [m] = [m/s] * [s] )
くるる
くるる
微分積分(セブンイレブン)いい気分…ファミチキ食べたい!

猛禽類ジョーク!!

  • 単位から数式の成り立ちを理解できる場合があります
  • 繰り返す!数式の”成り立ち”や”意味”に興味を持ってほしい!

物理シミュレーションのフロー

えーと…

くるる
くるる
1回整理してみるる

ニュートンの運動方程式体重0.2kgの”くるる”に重力という力が加わっていて…

【ニュートンの運動方程式】

   a = F / m

ニュートンの運動方程式から加速度を求められる…

加速度を積分したら速度、速度を積分したら位置が求められるから…

物理シミュレーションのフローはこんな感じだね!

【物理シミュレーションのフロー】

  1. 物体に加わる力を求める
  2. ニュートンの運動方程式から加速度を求める
  3. 加速度を積分して速度を求める
  4. 速度を求めて位置を求める
  5. ❶~❹を繰り返す
くるる
くるる
これで”くるる”落下時の〇秒後の落下速度や位置を再現できる!
はやぶさ
はやぶさ
大正解!!
ニュートンの運動方程式

少しだけ補足すると、”くるる”ちゃんに加わる下向きの力の合計”F”から加速度を求めるので、”F”の式は以下の通りです。

【くるるに加わる下向きの力】

   f1 = 重力

   f2 = カニが引っ張る力

   …

   fn = ???な力

【全ての力の合計値”F”】 

   F = f1 + f2 + … fn

ただし、今回は”くるる”に加わった力が”重力”のみとします。また、重力は質量mと重力加速度gの掛け算で求められます。

F = f1
F = 重力
F = m・g ( 単位 : [N] = [kg] * [m/s^2] )

※本記事では重力加速度g = 9.8とします

くるる
くるる
カニ許すまじ!クラブハウスサンドにして食べちゃうぞ!

猛禽類ジョーク!!

  • 繰り返す!「物体にどんな”力”が加わり、どんな運動をするのか?」という”力”に着目して現象を明らかにする学問が”力学”です
  • 物体に加わる”力”の向きと大きさに着目しましょう
  • 力⇒加速度⇒速度⇒位置の演算結果に基づき物理シミュレーションを行います

【Day1】Pyxelで物理シミュレーション

今までの説明が物理(力学)の基礎になります。以降からは、本題の『Pythonで物理シミュレーション』を実践していきます!

くるる
くるる
ちょっと疲れたので、おやつ食べて休憩してから続きやる!

今までのところをもう一度読み返すも良し!休憩するのも良し!すぐに先に進むのも良しです!

はやぶさ
はやぶさ
自分のペースで勉強して下さいね

物理シミュレーションの雛形ソースコード

物理シミュレーションのフローは以下の通りでしたね。

【物理シミュレーションのフロー】

  1. 物体に加わる力を求める
  2. ニュートンの運動方程式から加速度を求める
  3. 加速度を積分して速度を求める
  4. 速度を求めて位置を求める
  5. ❶~❹を繰り返す

これをPythonで実装したコードが以下です。

これが物理シミュレーションの『雛形コード』になります。

汎用性の高い『雛形コード』は色んなところで大活躍します

ソースコードの解説❶ -フレームレート-

くるる
くるる
FPS(フレームレート)って何?

FPSは”frames per second”の略称で1秒間に処理できるフレーム数(画像数)のことだよ。

FPSと物理シミュレーション

30fpsの場合は1秒間で30フレーム処理することになります。またフレーム間隔はfpsの逆数で求められます。

【フレーム間隔】

フレーム間隔 = 1 / fps ( 単位 : [s/f] = 1 / [f/s] )

ミリ秒で演算しても良いです(*・ω・)ノ♪

【フレーム間隔】

フレーム間隔 = 1000 / fps ( 単位 : [ms/f] = 1000[ms] / [f/s] )

30fpsの場合は33msecがフレーム間隔です。

つまり、猫が落下するアニメーション(物理シミュレーション)を考えたとき、次フレームには33msec後の落下位置に猫を描画すれば良いです。

くるる
くるる
だから、物理演算で使う微小時間がdt=1/fpsなんだね♪

正解!

ソースコードの解説❷ -基準と力の向き-

あれ?

くるる
くるる
くるる
何かの本かソースコードで重力の式にマイナスがついていた気がするよ

F = 重力
F = -m・g ( 単位 : [N] = [kg] * [m/s^2] )

くるる
くるる
プラスとマイナスどちらが正解なの?
はやぶさ
はやぶさ
基準次第だね。Pyxelで扱うフレーム(画像)の原点ってどこか覚えてる?
画素と座標
くるる
くるる
左上だよね!以下の記事で読んだ!
Pyxelでレトロゲームを作る
【Pyxel】Pythonでレトロゲームを作ろう! Day 1 -画像の扱い方-こんにちは! 前回こんな記事を書きました↓ https://cpp-learning.com/object-...

正解!”y軸の向き”と”力の向き”が同じならプラス、”反対向き”ならマイナスです。

たぶん”くるる”ちゃんは左下原点で説明している本かソースコードを読んだんじゃないかな?

くるる
くるる
あんまり覚えていなけど、重力⇒下向きの力⇒マイナスという感覚だった…基準次第だったのか

原点を左下に設定してから、物理シミュレーションを行うことも多いので、”くるる”ちゃんの感覚は正しいよ。

ただ、基準を気にせず、下向きはマイナス・右向きはプラスみたいな覚え方は良くないかもしれないね。

くるる
くるる
運動方程式を考えるときは、基準と力の向きを確認してから符号つけるようにするね♪

最近、三歳になった”くるる”ちゃん天才なのでは?

  • 基準軸の向きと力の向きが同じ:プラス方向の力
  • 基準軸の向きと力の向きが反対:マイナス方向の力
スポンサーリンク

最終的に完成したソースコード

くるる
くるる
ここまで分かれば、物理シミュレーションのソースコード作れる♪

”くるる”ちゃん最終的に完成させたソースコードはこちらです↓

 

くるる
くるる
これで”自由落下”の物理シミュレーションができる!

物理シミュレーションで遊ぼう!

作成したソースコード起動し、画像上の任意の位置でマウス左クリックすると猫が自由落下する物理シミュレーションを楽しめます(*・ω・)ノ♪

Pythonで自由落下の物理シミュレーション
くるる
くるる
猫がどこまでも落ちてゆく―
補足
  1. マウス左クリックで猫インスタンス生成
  2. 猫が画面下端まで来ると、インスタンスを破棄

という仕様なので、画面外でもずーっと自由落下しているわけではないよ

カニ登場!

うーん。。

Pythonで自由落下の物理シミュレーションくるる
くるる
くるる
もっと落下速度が速かった気がする…やっぱりカニが下から引っ張っていたのかな?
ニュートンの運動方程式
はやぶさ
はやぶさ
じゃあカニが引っ張る力も加えてシミュレーションしてみよう!
くるる
くるる
きっとメガトンパンチと同じくらいの力で引っ張ってるよ!

(メガ…なんだって?)

はやぶさ
はやぶさ
じゃあ10^6[N]の力を加えてみようか

ソースコードの69行目にカニが引っ張る力を追加します。

物理シミュレーション結果↓

Pythonで自由落下の物理シミュレーション
くるる
くるる
???
くるる
くるる
くるるのソースコードにバグがあったかな?
はやぶさ
はやぶさ
いや。。たぶん目に見えないだけだと思う…

試しに10^4[N]に変更してみます。

物理シミュレーション結果↓

Pythonで自由落下の物理シミュレーション
くるる
くるる
きゃーーー!カニ許すまじ!!
くるる
はやぶさ
はやぶさ
くるるちゃんが楽しそうで何よりです!笑

ソースコードを色々と改造して物理シミュレーションを楽しんで下さいね

おわりに

『Pythonで物理シミュレーションをしよう!Day1 -自由落下-』について説明しました。

pyxelを使って、楽しく「物理」や「プログラミング」の勉強ができると良いなーとか考えながら、本記事を書きあげました。

楽しかった!物理やプログラミングに興味を持った!
次回作(Day2の記事)も読みたい!

という人が少しでもいると嬉しいです。

くるる
くるる
めっちゃ楽しかった♪続きはよー

次回予告

『Pythonで物理シミュレーションしよう!』シリーズ記事ですが、何記事書くかなどについて、あまり決めていません。

ただし、重要な基礎の部分は本記事にギュッと凝縮して書いています。

なので、本記事の内容を理解⇒応用することで様々な物理シミュレーションを実現できるようになります。

”くるる”ちゃんのように好奇心旺盛に色々な物理シミュレーションに挑戦して下さいね!

くるる
くるる
はやぶさ先生お願いがあります
くるる

さっそく好奇心旺盛なフクロウがキラキラした目でお願いしてきた。

くるる
くるる
猫が落ち続けるのは可哀想なので、地面に着地させてあげたい!

”くるる”ちゃん優しいな~

はやぶさ
はやぶさ
分かった!じゃあこんなのどうかな↓
Pythonで自由落下の物理シミュレーション Pythonで反発の物理シミュレーション

「地面に綺麗に着地する猫」「地面に反発する猫」

くるる
くるる
めっちゃ可愛い!次回はよー

本記事楽しかったかな?次回もお楽しみに~

Pyxelでレトロゲームを作る 総集編
【Pyxel】Pythonでレトロゲームを作ろう! 総集編 -まるっと1週間でゲーム開発入門-Python向けのレトロゲームエンジン:pyxelを用いたゲーム開発入門チュートリアル(ソースコード付き)を書きました。画像処理・数学・物理・制御について学び、実践としてゲームプログラミングまで行います。...
python(pygame)でゲームを作る
【Python】ゲームソフト開発を題材にしたオブジェクト指向入門ゲームソフト作成を題材にした「オブジェクト指向」の入門記事を書きました。オブジェクト図/クラス図の書き方や考え方のポイントも説明した実践的な内容になっています!ソフトウェア設計やソフトウェア開発を学びたい人にオススメの記事です!...
LINEスタンプ配信中!

フクロウのLINEスタンプ

当サイトのマスコットキャラクター

「フクロウのくるる」が

LINEスタンプになりました!

勉強で疲れたあなたに癒しをお届け☆

お迎え待ってます(*・ω・)ノ♪

今すぐお迎えする

40個セットがたったの50コインとお得です