衝突

衝突なし


 ない知恵を振り絞ってみましたが、衝突処理を加えずに衝突しているような雰囲気を醸し出すのは不可能でした。

発見!

 運動量保存とはねかえり係数で衝突を表現できるところまでは分かったのですが、それを利用してプログラムを書こうとすると変に複雑になりあきらめていました。
マルペケつくろーどっとコム -> ゲームつくろー! -> 衝突判定編 -> 2つの球を当てて跳ね返らせる!
 しかし、どうしてもやってみたかったので検索したところ、とてもすばらしいサイトにヒットしたので、参考にしてがんばってみようと思います。
 見たことのない言葉や式が並んでいるので若干不安ですが、新しいことを学べるのは楽しみでもあります。
 内積・外積の項は必読!高校数学で止まっている自分には目から鱗ですた。外積をなぜ教えてくれなかったのか!

メモ

 非常に汚いですが、自分なりにまとめたノートの一部です。理解が進むとノートがきれいになってくるのでそれを目安に続けます。
 それもこれもよい教材のおかげです。

 教材と異なる記号を使うことで自分の理解度を確認してみたり、

 省略されている箇所を実際に計算してみたり。
 ここで一度間違えました。答えが分かっていない場合の計算間違いは必死レベルのミスなのにこの体たらく。
 聞いたことのない単語や見たことのない記号が多く、理解できるレベルに落とすのに時間がかかりました。

結果

 たぶん自分で計算できると思いますが、計算ミスでさまよいたくないので素直に答えを利用します。
 教材の最後にあるソースはそのままでは利用できないので、少し上の方にある式からプログラムを組んでいます。
void collision(n1, n2){
  //v'1 = -1 * m2 * (1 + e) / (m1 + m2) * Dot(v1 - v2, c) * c + v1;
  //v'2 = m1 * (1 + e) / (m1 + m2) * Dot(v1 - v2, c) * c + v2;
  //共通 上のeと下のeは意味が違う、紛らわしいので次回修正
  float e = (1 + 0.75) / (obj[n1].m + obj[n2].m);
  float cx = (obj[n2].px - obj[n1].px) / GetDist(obj[n1], obj[n2]);
  float cy = (obj[n2].py - obj[n1].py) / GetDist(obj[n1], obj[n2]);
  float dot = Dot(obj[n1].sx - obj[n2].sx, obj[n1].sy - obj[n2].sy, cx, cy);
  cx *= e * dot;
  cy *= e * dot;
  //v'1
  obj[n1].sx += -1 * obj[n2].m * cx;
  obj[n1].sy += -1 * obj[n2].m * cy;
  //v'2
  obj[n2].sx += obj[n1].m * cx;
  obj[n2].sy += obj[n1].m * cy;
  //1フレーム強制移動
  obj[n1].px += obj[n1].sx;
  obj[n1].py += obj[n1].sy;
  obj[n2].px += obj[n2].sx;
  obj[n2].py += obj[n2].sy;
}

<collisionB.pde>


 入力間違いがないか確認したり、一行ごとにログを出したりすること3時間。
 位置ベクトルと速度ベクトルを取り違えるという致命的なミスをようやく発見し、解決!
 めり込みが気になりますが、時々かわいいと思える動きをするので今回は放置します。

加速度初期化のし忘れを修正しました(2012.11.22)