Python

【Pyxel】Pythonで物理シミュレーションをしよう! Day 2 -衝突-

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

こんにちは!

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

前回こんな記事を書きました↓

pyxelで物理シミュレーション
【Pyxel】Pythonで物理シミュレーションをしよう! Day 1 -自由落下-こんにちは! 以前『Pythonでレトロゲームを作ろう!』シリーズの記事を書きました。 https://cp...

本記事は『Pythonで物理シミュレーションをしよう!』シリーズの”Day2”です!

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

前回までに学んだこと

”Day1”の記事で以下のことを勉強しました。

Pythonで物理シミュレーションをしよう!-Day1-
  • 物理(力学)の基礎
  • 物理シミュレーションの『雛形ソースコード』の作り方
  • 自由落下運動の物理シミュレーションをPyxelでアニメーション化

忘れている人や不安な人は、もう一度”Day1”の記事を読んでみてね(*・ω・)ノ♪

Pythonで自由落下の物理シミュレーション  Pythonで自由落下の物理シミュレーション

「自由落下する猫」と「下から強い力で引っ張られて落下する猫」

”Day1”の記事を読めば、自分の好きな”キャラ”で自由落下運動を実践できるようになります!

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

”Day1”の記事では自由落下させて終了でしたが、本記事では着地させます。

Pythonで自由落下の物理シミュレーション  Pythonで反発の物理シミュレーション

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

くるる
くるる
どっちも可愛いけど、難しそう…

大丈夫!本記事で丁寧に解説するし、以下の記事を読んだ”くるる”ちゃんなら「地面に綺麗に着地する猫」のプログラムはもう作れるはずだよ!

Pyxelでレトロゲームを作る3
【Pyxel】Pythonでレトロゲームを作ろう! Day 6 -当たり判定-こんにちは! 前回こんな記事を書きました↓ https://cpp-learning.com/pyxel_a...
くるる
くるる
当たり判定…なるほど♪
くるる

くるるちゃんは何か閃いたようです!

勉強は積み重ねが大事です。頑張って学んだ”過去”の自分が”現在”や”未来”の自分を助けてくれる日が必ずきますよ

スポンサーリンク

猫と地面の当たり判定

最初に猫と地面の座標を確認します。

Pythonで衝突の物理シミュレーション

猫が落下する・しないは猫と地面の当たり判定で考えることができます。

【猫が落下】
  猫の足が地面よりも上にある状態(地面に当たっていない)

【猫が着地】
  猫の足が地面に接触あるいは地面に足が埋まる状態(地面に当たっている)

これを数式に落とし込むと…

【猫が落下】
  self.Cats[i].pos.y + CAT_H < ground.pos1.y 

【猫が着地】
  ground.pos1.y <= self.Cats[i].pos.y + CAT_H

※y軸が下方向なことに注意

【猫が着地】の式が”当たり判定”の条件式になります。

画面の左端から右端まで地面が続いている場合、上記の条件式のみで良いのですが、今回は右端と左端に隙間がある地面を扱います。

Pythonで衝突の物理シミュレーション

さきほど同様、猫が地面より下に落下する・しないは猫と地面の当たり判定で考えることができます。

【猫が地面より下に落下】
  猫が地面の外側にいる状態(地面に当たっていない)

【猫が着地】
  猫が地面の内側にいる状態(地面に当たっている)

これを数式に落とし込むと…

【猫が地面より下に落下】
Cats[i].pos.x + CAT_W < ground.pos1.x
かつ
ground.pos2.x < Cats[i].pos.x

【猫が着地】
ground.pos1.x <= Cats[i].pos.x + CAT_W
かつ
Cats[i].pos.x <= ground.pos2.x

【猫が着地】の式が”当たり判定”の条件式になります。

以上から、猫と右端および左端に隙間がある地面との当たり判定は以下のよう表現できます。

【猫が着地】

猫の足が地面に接触あるいは地面に足が埋まる状態
かつ
猫が地面の内側にいる状態

これを数式に落とし込むと…

【猫が着地】

ground.pos1.y <= self.Cats[i].pos.y + CAT_H
かつ
ground.pos1.x <= Cats[i].pos.x + CAT_W
かつ
Cats[i].pos.x <= ground.pos2.x

くるる
くるる
完全に理解した!じゃあソースコードはこんな感じでだね↓

正解!

以下の記事で『当たり判定』を勉強済みの”くるる”ちゃんは”スッと”理解できたようです。

Pyxelでレトロゲームを作る3
【Pyxel】Pythonでレトロゲームを作ろう! Day 6 -当たり判定-こんにちは! 前回こんな記事を書きました↓ https://cpp-learning.com/pyxel_a...

シューティングゲームなどにも使われる『当たり判定』について、もっと勉強したい人は『Pythonでレトロゲームを作ろう!Day 6-当たり判定-』の記事を読んでみてね(*・ω・)ノ♪

繰り返す!勉強は積み重ねが大事です

物理シミュレーション -地面に綺麗に着地-

猫と地面との『当たり判定』の条件式まで説明しました。

次は、地面に当たったときの処理(着地したときの処理)を考えてみます。

Pythonで自由落下の物理シミュレーション

「猫が地面に綺麗に着地した」というのが、どんな現象(どんな状態)なのか?を考えてみます。

くるる
くるる
着地したときの衝撃を猫が吸収して静止状態になった!

”くるる”ちゃん…すごい!

ただ、「着地した瞬間の衝撃を猫が吸収して…」というのをシミュレーションするのは、とても難しいので、「静止状態になった」という現象だけを再現します。

つまり、猫が地面に当たったとき”猫の落下速度=0”にすれば良いです。

くるる
くるる
完全に理解した!じゃあソースコードはこんな感じでだね↓

正解!

最終的に完成したソースコード -地面に綺麗に着地-

最終的に完成した「猫が地面に着地する物理シミュレーション」のソースコードが以下です。

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

おわりに

『Pythonで物理シミュレーションをしよう!Day2 -衝突-』について説明しました。

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

Pythonで反発の物理シミュレーション

冒頭で紹介した「地面に反発する猫」の物理シミュレーションについても説明したかったのですが…

意外と本記事のボリュームが多くなってしまったので、次回”Day3”の記事で説明しますね。

くるる
くるる
楽しみが増えた!嬉しい!!

どうすれば、「反発する猫」のシミュレーションを実装できるか考えるのも面白いですよ(*・ω・)ノ♪

余裕がある人は自作してみて、”Day3”の記事で答え合わせするのも良いですね!

くるる
くるる
実は自作できそうな気がしてる!あの部分をあーしてこーして…
くるる

夢中でプログラミングしている”くるる”ちゃんが今日も可愛い!

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

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

フクロウのLINEスタンプ

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

「フクロウのくるる」が

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

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

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

今すぐお迎えする

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