衝突後の速度を求めるための数式をWordで書いたものが見つかったので、
あげておきます。
Download file
結構よさげですね。ただ、Flashはオブジェクトの位置を変更すると、即反映されてしまうので、
たまにおかしく見えますね(まぁ僕が作っためりこみ補正処理が甘いからなんですが)。
ダブルバッファリングみたいな機能がFlashにはないのかな?
自前で実装するのも、なんか変な気分だし・・・。
今回は「めりこみが発生しないギリギリの状態である”接触”の状態を求める」ことによってめりこみを解消するための第一歩とします。
で、考えていたら、なんか昔同じようなことで悩んでいたことを思い出しました。

こういう考え方でいけるのかどうか・・・。
Physics for Game Developersを読んで、もう少し精進します。
[続きを読む..]
まず、力学的エネルギー保存則、運動量保存則から連立方程式をたてる。
ここで、二つの物体obj1とobj2を考える。
それぞれ、質量をm1,m2、衝突前の速度をv1,v2、位置をr1,r2、
衝突後の速度をv1',v3'とすると
- m1v1 + m2v2 = m1v1' + m2v2'
- 1/2m1v1^2 + 1/2m2v2^2 = 1/2m1v3^2 + 1/2m2v4^2
となります。
これをばばっと解くと、v3,v4は
var a, b, c;
a = m1 + m1 * m1 / m2;
b = -2 * m1 * (m1 / m2 * v1 + v2);
c = (m1 * m1 / m2 - m1) * v1 * v1 + 2 * m1 * v1 * v2;
var v3, v4;
var sign = (v1 < v2) ? 1 : -1;
v3 = (-b + sign * Math.sqrt(b * b - 4 * a * c)) / (2 * a);
v4 = m1 / m2 * (v1 - v3) + v2;
a,b,cは解の公式をとくときによく出てくるアレです。
とまぁ、こんな感じで衝突後の速度が求まります。
[続きを読む..]
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"
WIDTH="320" HEIGHT="240" id="collision">
TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer">
物体の質量、速度を考慮した運動をさせています。
摩擦のない、ツルッツルの床で転がしています(滑らせています)。