2009年01月16日

ゲーム数学3

前回は静止時の球と球との当たり判定を記述しましたが
これではゲームに適応することはできません。

ゲームの球というのは常に動き回っているので
動く球と球との当たり判定が必要になってきます。


半径RAの球Aが(XA,YA,ZA)にあり1フレームごとに(xa,ya,za)動くとします。
半径RBの球Bが(XB,YB,ZB)にあり1フレームごとに(xb,yb,zb)動くとします。
この2つの球の当たり判定を行います。



まず考えなくてはならないのは前フレームに球A,Bはどこにあったかということです。
球Aが(XA-xa,YA-ya,ZA-za)に球Bが(XB-xb,YB-yb,ZB-zb)にあったことがわかります。
つまりこの2点でしか当たり判定していないので、
球Bが画面真ん中にあり、球Aが画面端から端まで1フレームで移動してしまった場合当たり判定されず
球Aが球Bをすり抜けてしまうバグが発生します。
ここで0<t<1 媒介変数tを使い、この間に存在したはずの当たり判定を行います。
小数点は使いたくないので10倍して行います。


for (int t = 0; t < 10; t++) {
  int XX = ((XA*10)-xa*t) - ((XB*10)-xb*t);
  int YY = ((YA*10)-ya*t) - ((YB*10)-yb*t);
  int ZZ = ((ZA*10)-za*t) - ((ZB*10)-zb*t);
  if (XX*XX + YY*YY + ZZ*ZZ <= (RA+RB)*(RA+RB)*100) {
    // 当たってるよ
  }
}



媒介変数tを回す回数は球の大きさや移動距離と判定する精度、処理の重さなどによって調整が必要です。
今回は整数型で行いましたが、浮動小数点型でも行うことは可能です。


ラベル:六本木店長
posted by ラクサス at 16:14| Comment(0) | TrackBack(0) | 技術情報 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。