fc2ブログ

Javaゲーム制作記

いろいろ作ってます  

木材追加&剛体の衝突

遅くなりましたがつぶつぶ2に木材を追加しました。
最初の剛体です。よく燃えます。

システムが大きく変わったのでソースを丸コピする訳にもいかず、
なかなか実装に時間がかかりました(特に分裂処理…)。





表面温度は最大900度近くまで達する

今更気付いたんですが、Rubberと繋げられるようにしておくの忘れてました。
びよんびよん出来ませんね。 すみませんがまた次回に・・・

ちなみに今回から粒子にアンチエイリアスがかかってます。
四隅に点を追加しただけですが、だいぶ滑らかな印象になりました。



以下おまけ(本編?)ですが、剛体の衝突についてもう一度考えてみました。


--------------------------------------


2つの剛体の衝突について考えてみます。

途中でおかしい所がありましたら、ぜひ教えてください。


衝突が発生すると当然力が生じ、双方の剛体の運動量を変化させます。
運動量とは、速度に質量を掛けたものです。
この変化した運動量に等しいものが力積です。

また、運動量保存則より、双方の剛体の衝突前・衝突後の運動量の合計は等しくなります。
各剛体の衝突前の速度をv1、v2、衝突後の速度をv'1、v'2、質量をm1、m2とすると、

m1 * v1 + m2 * v2 = m1 * v'1 + m2 * v'2

と表すことができます。
※以降、「*」は乗算、「/」は除算を表します

この運動量保存則は、後述する作用・反作用の法則を守れば自動的に満たされるので、
今回は特に気にする必要はありません。



もう一つ、反発係数というものがあります。
文字通り跳ね返りの具合を表し、衝突前と衝突後の速度の差の比に等しくなります。
ちょっとややこしいですね。
先程と同じように式にしてみましょう。

e = -(v'2 - v'1) / (v2 - v1)

eが反発係数です。
通常この値は0≦e≦1で、この範囲を超えることはありません。
もし超えたら大変なコトになってしまいます(衝突前より速度差が増える!?)。

力積について思い出してみましょう。
力積とは、衝突によって生じた運動量の変化のことでしたね。
剛体1に働く力積をJとすると、

J = m1 * (v'1 - v1)

と表せます。
ここで作用・反作用の法則により、剛体1と剛体2が受ける力の大きさは等しく、向きは正反対となります。
よって剛体2に働く力積は、

-J = m2 * (v'2 - v2)

と表すことができます。



Jを求めてみましょう。
まず、衝突後の剛体の速度について解きます。

v'1 = v1 + J / m1
v'2 = v2 - J / m2

次に、これを反発係数の式に代入します。

e = -(v'2 - v'1) / (v2 - v1)

e = -{(v2 - J / m2) - (v1 + J / m1)} / (v2 - v1)

変形していきます。

e * (v2 - v1) = -{(v2 - J / m2) - (v1 + J / m1)}

e * (v2 - v1) = -v2 + J / m2 + v1 + J / m1

e * (v2 - v1) = -(v2 - v1) + (J / m1 + J / m2)

J / m1 + J / m2 = e * (v2 - v1) + (v2 - v1)

J * (1 / m1 + 1 / m2) = (e + 1) * (v2 - v1)

J = (e + 1) * (v2 - v1) / (1 / m1 + 1 / m2)

Jが解けました。
このJを使って衝突後の各剛体の速度を求められます。

…が、ここでの速度は1次元の数値として扱ってきました。
2次元や3次元のベクトルの速度を持つ剛体はどうすればよいのでしょう?

これは、速度を方向と大きさに分解することで解決できます。
法線ベクトルという概念を導入します。
衝突には必ず向きがあり、その向きを単位ベクトル(=長さ1のベクトル)で表したものが法線ベクトルです。
この向きは、力積Jの作用する方向でもあります。

法線ベクトルをnとすると、先程の式の

v2 - v1

の部分は、衝突の向きにおける速度の大きさ、すなわち法線ベクトルとの内積

n・(v2 - v1)

で表すことができます。
そして衝突で発生する力のベクトルは、法線ベクトルに力積を掛けたもの、つまり

J * n

となります。

これらを元に衝突後の速度を求めてみましょう。

v'1 = v1 + (J / m1) * n
v'2 = v2 - (J / m2) * n

また、法線ベクトルを利用した力積の式は以下のようになります。

J = (e + 1) * {n・(v2 - v1)} / (1 / m1 + 1 / m2)


はい、お疲れ様でした!
これで2つの剛体の衝突計算ができるようになりました。

なお、この式は回転要素を一切考慮していないので、衝突による回転を計算することはできません。
回転も考慮すると、各速度や慣性モーメント、衝突位置も計算に入れる必要があります。
力積の式も複雑になるので、ここでは割愛しました。
それについては、また別の機会に。

[ 2012/05/31 22:37 ] 物理演算 | Comment(1)
>>あちまさん
申し訳ないですが、記事に関係ないコメントは削除するようにしています。
ちなみにこれですね。久々に見たら相当変わってました。 ttp://powdertoy.co.uk/
[ 2012/06/03 21:19 ] [ 編集 ]
コメントの投稿




※URL記述の際はttp://としてください


プロフィール

saharan

Author:saharan

Twitter
検索フォーム