Processingで3D物理演算
#Java をべースに動くグラフィック表現のためのプログラミング言語 #Processing で,3Dで物理演算を実装し,球と平面の落下・衝突をシミュレーションしました. 重力によって落下した球が平面と衝突し,あるいは他の球と衝突しているのがわかると思います.
また平面が回転すると,その傾きに応じて球の跳ね返る方向が変わります.
https://youtu.be/Pg2oCj7ZGfE
【アルゴリズム】
運動方程式F=maというものがあります.つまり質量と力が分かれば加速度がわかるというものですね.
そして加速度を毎時どんどん足していけば速度に,速度を毎時どんどん足していくと位置になります.
あとは然るべきタイミングに,然るべき物体に,然るべき力を加えてやれば自然と物理現象が現れます.
今回与える力は2つ.
重力
衝突時の力
今回用いる物体は球と平面の2つですが,このうち球にのみ重力がかかるとします.
そして,今回おこりうる衝突は以下の2つ.
球と球の衝突
球と球の衝突は,「球の中心間の距離が,2つの球の半径の合計よりも小さくなった」際に起こります.
この時,前者と後者の差に応じて力を加えます.
球の中心間距離は球の中心の座標がわかれば三平方の定理により求まります.
球と平面の衝突
球と平面の衝突は,「球の中心と平面の間の距離が,球の半径よりも小さくなった」際に起こります.
これも,前者と後者の差に応じて力を加えます.
球の中心から平面までの距離は「点と平面の距離公式」により分かります.
また,平面は方向キーによって回転が可能です.
z軸→x軸→z軸の順番に回転を行うオイラー角によって平面の描画する角度を変えています.
この時さらに平面に垂直な「法線ベクトル」も求めています.
球との衝突時,球にはこのベクトルと同じ方向に力が加わりますので,欠かせません.
コードを書くにあたってはこの資料を大いに参考にしました.
もう結構前のことだから回転行列の辺りの所とか思い出すのに時間がかかった