衝突計算について

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

衝突計算について

#1

投稿記事 by MASSA » 9年前

Windows7、Visual C++ 2008、DXライブラリを使っています。


画面上に20×20ピクセルの四角形の画像を描画し、玉(四角ですが)が2個の「エアーホッケー」のようなゲームを作りたいと思っております。
玉が1つの場合は問題ないのですが、2つにすると、玉同士の衝突の計算を、どのようにしたらいいのか分からなくなってしまいました。


玉1の左上の頂点を(ball_1_x,ball_1_y)
玉2の左上の頂点を(ball_2_x,ball_2_y)  

変数として
玉1の角度をkakudo1 (double)
玉2の角度をkakudo2 (double)

玉1の速度をspeed_1 (double)
玉2の速度をspeed_2 (double)


としました。

コード:


    plus1_x=speed_1*cos(kakudo1) ;        //座標の増減数決定  (plus_1_xは一時的に使っている変数(double))
    plus1_y=speed_1*sin(kakudo1) ;        //↓

    ball_1_x=ball_1_x+plus1_x+0.5;          //座標変更(四捨五入処理付き)
    ball_1_y=ball_1_y+plus1_y+0.5;          //↓

玉1ではこのようなコードで座標を変更しています。玉2も同様です。

今回の問題は、速度は無視して良いので、角度だけの問題なのです。
単純な反射の計算をしたいです。

例えば、玉1の左の辺と、玉2の右の辺が当たった場合、kakudo1 = 9.4245-kakudo1;kakudo2 = 3.1415-kakudo2;
 玉1の下の辺と、玉2の上の辺が当たった場合、kakudo1 = 6.2830-kakudo1;kakudo2 = -kakudo2;

などと、しようとのですが…                  
どの辺と、どの辺が衝突したかを判定するコードが分かりません(汗

それさえ出来ればうまく行くと思うのですが…
または、全く別な方法でも良いので、どなたかこの問題を解決するコードを考えていただけないでしょうか…


高校数学は一通り理解できると思います。     

MASSA

Re: 衝突計算について

#2

投稿記事 by MASSA » 9年前

すみません(汗

ball_1_x …はintでした

アバター
ookami
記事: 214
登録日時: 9年前
住所: 東京都

Re: 衝突計算について

#3

投稿記事 by ookami » 9年前

こんにちわ。
http://kaz.cyteen.nagoya-bunri.ac.jp/ad ... test3.html
このページはjavaですけど考え方は参考になるかも... いかがでしょうか?

おっく

Re: 衝突計算について

#4

投稿記事 by おっく » 9年前

>玉が1つの場合は問題ない

それなら、一連の衝突処理を関数に切り分けて、
その関数が衝突物の情報を引数に取るように作れば、
玉が何個出てきても処理ロジックは増えないように作れると思います。

コード:

void Hit(type object1, type object2)
{
	//object1とobject2の衝突処理
	//ご自身で作った玉ひとつなら問題ないというコード
	~~~
}
衝突処理が出来てるなら、
あとはそれぞれの位置や大きさが違うだけですので、
すぐ解決出来そうに思えます。

>どの辺が衝突したかを判定する
お互いが2次元の四角形なら、衝突対象1の4頂点と、
衝突対象2の4頂点の関係を見れば、どの辺が当たったかわかります。
玉の移動方向も分かってるようなので、
当たった辺によって、xもしくはyの符号を逆転すればそれっぽく動くでしょう。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: 衝突計算について

#5

投稿記事 by h2so5 » 9年前

衝突判定についてはこのページはどうでしょうか
http://marupeke296.com/COL_2D_No4_SquareToSquare.html

あと、提示されたコードを見る限り、このままでは上手くいかないと思います。
四角形同士の衝突計算はもっと複雑です。

まずはエアーホッケーの玉を円にして作ってみることをお勧めします。

アバター
GRAM
記事: 164
登録日時: 9年前
住所: 大阪

Re: 衝突計算について

#6

投稿記事 by GRAM » 9年前

2Dにおける長方形同士の衝突にはh2so5さんの紹介した方法もふくめいくつか方法があります

①多角形の内側に頂点が存在するかをベクトルを使って判定する方法(h2so4さんの紹介のとおり)

② ①をちょっと変更して
(i)まず1つの長方形の各辺が座標軸の方向となるように座標変換する
(ii)もう一方の多角形の各頂点が座標変換後の空間で各軸に平行な長方形の内側にいるかを判定する(軸平行なので容易)

・・・さてh2so4さんのページの方法も②も実は完璧ではありません
具体的な例を図に表します
完全な方法は③「分離軸判定」というものを用いることで解決できます

分離軸判定についての簡単な説明は
http://marupeke296.com/COL_3D_No13_OBBvsOBB.html
こちらのページにあります
このページは3Dを扱っていますが2Dでも基本となる考えは同じです

要は各辺の方向へ頂点を投影してすべて重なってなければOKです。
(リンク先に説明があると通り実は頂点ごとに投影する必要はありません)
添付ファイル
新規ビットマップ イメージ.PNG
新規ビットマップ イメージ.PNG (2.89 KiB) 閲覧数: 855 回

アバター
MNS
記事: 35
登録日時: 9年前

Re: 衝突計算について

#7

投稿記事 by MNS » 9年前

どの辺が当たっているかは、四角形同士の位置関係を調べれば分かるのでは?
例えば、2つの四角形をA(ax,ay)、B(bx,by)と置くとすれば、AとBが衝突しているとして、
(ちなみにax,ay,bx,byはそれぞれの四角形の中心の座標)
if( AがBの左にいる(= ax < bx) )、
 if( bx - ax < 10 ) → Bの左辺とAの右辺が衝突
else (=… AがBの右にいる)
 if( ax - bx < 10) → Aの左辺とBの右辺が衝突
これをyに置き換えれば、上辺下辺の衝突も分かると思います。
もちろん、リアルな動きには程遠いものになると思いますし、
あえて厄介な四角形を衝突判定に用いるよりは、
素直に円として考えたほうが楽だと思いますよ。

補足;ちなみに四角形が回転していないことが前提です。

MASSA

Re: 衝突計算について

#8

投稿記事 by MASSA » 9年前

返信してくださった皆様、どうもありがとうございます。

どうやら、私は衝突計算を甘く考えていたようです。


皆様のご助言を参考に、もう少し勉強して、もう一度考えてみようと思います。



ありがとうございました。

閉鎖

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