バネマス系などの物理シミュレーションして遊んでたのは今は昔、20年以上前になりますか。
当時はC++からSDL使ってみたり、MFCから標準のグラフィック使ったりしたっけ…
今はProcessingっていうのがあるんですね。まあ、数年前からそんなのあったなぁとは思っていましたが、ふと、また物理シミュレーションやってみたくなって、Processing始めました。
バネマス系のシミュレーションをやってみる(オイラー法)
やりたいことは2つの質点を作り、その間をバネで結ぶ。画面下方に重力加速度が働いていて、自由に運動させます。
物理シミュレーションについてはライブラリとかあるのかもしれませんが、自分で作ることに。
質点を表すクラス、リンク(バネ)を表すクラスを作り、2点とそれらをつなぐバネだけでシミュレーション。数値積分はオイラー法にて。とにかく手軽に作りたかったので難しいことはやらない。シンプルにオイラー法です。
結果の動画はこんな感じ:
ダンパが無くバネだけで作ったらとっても不安定。
エネルギー保存の法則って何?って感じで元の高さを軽々超え、そして宇宙の彼方に消えてしまいました。んーこれじゃぁイヤ。
真面目にミッドポイント法(中点法)でシミュレーションしてみる
ミッドポイント法、実は実装するのが初めて。
以前シミュレーション作ったときはオイラー法だけでした。ていうかミッドポイント法の実装法が分からなかったから。
昔どっかでみたソースコードにミッドポイント法が書いてあったのを、記憶を掘り起こし、またWiki先生も調べながらなんとか実装しました。
その結果がこちら:
うん!いい!
エネルギー保存の法則が満たされている!
とっても安定!
満足しました\(^o^)/
まとめ
今回はバネマス系シミュレーションを作りました。
そして初めてミッドポイント法を実装し、その性能に感動!
若いころの自分に教えてあげたい気分になりました。
なんか楽しかった。物理シミュレーション作ってると懐かしくなってきます。昔を思い出して。これからまたなにか作ろうかなぁ?
今回作ったProcessingプロジェクト
オイラー法実装版:
sketch_20210819_2227_euler.zip
ミッドポイント法実装版:
sketch_20210819_2359_midpoint.zip