ピンボールのバーの処理 バー動作時のボールへの衝突処理
バー動作時ボールへの衝突処理を行うサンプルswfを作成。作ってみて、以前のメモでは足りなかった考えがありましたので、それを追加しました。
サンプル1
以前のメモを元にしたサンプル1
紺点 : ボール現在位置 青点 : ボール移動予定位置 紺点から青点の線 : ボール軌道 緑点から赤点の線 : バー現在位置 緑点から黄点の線 : バー移動予定位置 緑点から紺点の線 : ボールに衝突するバーのイメージ 紺点からピンク点 : ボールに働くバーの接線速度 紺点から水色点 : ボール衝突後の速度 ボール質量 : 1 バー質量 : 30 はねかえり係数 : 1
処理順序
サンプル1は次のような処理順序で求められています。
(1)ボール現在位置がバー移動エリア内にあるかどうか判定
(2)ボール現在位置と円中心点とを結ぶラインオブジェクトL(サンプル緑点から紺点)取得
→このLがボールに衝突するバーのイメージとなる
(3)バー現在位置とLとの成す角度より ボール衝突時の接線速度を取得
(4)ボール軌道(ボール速度)と接線速度を用い
運動量保存の法則と一直線上の衝突の式から ボール衝突後の速度を取得
サンプル1の問題点
各点が図1の配置になる場合を考えて見ます。
[ 図1 ]
上向きのボール速度(紺点から青点)にバー接線速度(紺点からピンク点)が衝突し、いい具合に跳ね上がっています(紺点から水色点)。
次に、各点が図2の配置になるようになる場合を考えてみます。
[ 図2 ]
ボール衝突後の速度(紺点から水色点)が、衝突前のボール速度(紺点から青点)よりも小さくなってしまっています。ボール進行方向の後ろから衝突を受けたにもかかわらず、衝突前の速度よりも衝突後の速度が小さくなることはおかしなことです。
ここで以前のメモでは、何か考えが間違っている、または考えが足りていないのでは、ということに気付きました。
図1,2は、ボールの進行方向の後ろからバーが衝突するイメージです。ということは、バーが動作する速度よりもボールの速度が速い場合、ボールの後ろからバーが衝突することはありえないのでは。そして、その時はボールの衝突処理を行ってはいけないのでは、と考えました。
これを解決したものがサンプル2となります。
サンプル2
サンプル1に新たに判定を加えたサンプル2
灰色の点 : 接線速度に対するボール速度の投影
灰色の点がピンクの点を超えたとき、バーが動作する速度よりもボールの速度が速い場合とみなし、ボールの反射処理は行われません(ボール衝突後の速度を示す水色の点は消えます)。
未実装部
ボール衝突後の移動先の水色点がバー移動エリア内にまだ存在する場合、その水色点をボールの現在位置そして、再度バーとボールとの衝突処理を行う必要がありますが、その処理はまだ実装していません。なので、バー移動予定位置のライン(緑点と黄点)を動作させても、ボール衝突後の位置は変化しません。
続く。