ボールとボールの衝突判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
fey

ボールとボールの衝突判定について

#1

投稿記事 by fey » 14年前

向きや速度と質量を持っている球同士が衝突した時、その後の向きと速度の求め方が分かりません。
普通の衝突ならできるのですが、角度を持った衝突をした場合の速度と向きの変化が分かりません。
どうすればよいのでしょうか?

※普通の衝突の場合のソースです。
 sub_x:計算に使う値の保存用
 sub_y:計算に使う値の保存用
 X_pos:X座標
 Y_pos:Y座標
 speedX:X座標の移動速度
 speedY:Y座標の移動速度
mass:球の質量
r:球の半径
BoundingCircle:球の当たり判定関数(当たった時に1を返す)

コード:

 

	// 円の移動
	for(i=0; i<2; i++){
		en[i].X_pos += en[i].speedX;
		en[i].Y_pos += en[i].speedY;
	}

	//// 円の当たり判定
	if(1 == BoundingCircle(en[0].X_pos, en[0].Y_pos, en[0].r, en[1].X_pos, en[1].Y_pos, en[1].r)){

		// 値の保存
		sub_x = en[0].speedX;
		sub_y = en[0].speedY;

		// 当たった時の挙動
		en[0].speedX = ( ((en[0].mass - (e * en[1].mass)) * en[0].speedX) + ((1 + e) * en[1].mass * en[1].speedX) ) / (en[0].mass + en[1].mass);
		en[0].speedY = ( ((en[0].mass - (e * en[1].mass)) * en[0].speedY) + ((1 + e) * en[1].mass * en[1].speedY) ) / (en[0].mass + en[1].mass);

		en[1].speedX = ( ((en[1].mass - (e * en[0].mass)) * en[1].speedX) + ((1 + e) * en[0].mass * sub_x) ) / (en[0].mass + en[1].mass);
		en[1].speedY = ( ((en[1].mass - (e * en[0].mass)) * en[1].speedY) + ((1 + e) * en[0].mass * sub_y) ) / (en[0].mass + en[1].mass);
	}


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ボールとボールの衝突判定について

#2

投稿記事 by softya(ソフト屋) » 14年前

とりあえず参考です。
「円の衝突の計算 - 物理学 - 教えて!goo」
http://oshiete.goo.ne.jp/qa/3544027.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: ボールとボールの衝突判定について

#3

投稿記事 by ISLe » 14年前

ボールが任意の角度の壁と衝突したあとの進行方向の求め方は分かりますか?

ボールとボールの衝突はボールの中心同士を結んだ線分と垂直に交わる壁に衝突したと考えることができます。
わたしのブログに壁とボールの衝突をシンプルに実装した記事を投稿してるんですけど参考になるかもしれません。
記事へのリンクを貼るとフォーラムルールに抵触するおそれがあるので、投稿の見出しのURLがブログへのリンクなのでそこから辿ってください。

閉鎖

“C言語何でも質問掲示板” へ戻る