追尾ミサイルを打つには

◆PROCESSING 逆引きリファレンス

 カテゴリー:ゲーム作成

追尾ミサイルを打つには

【解説】

打った弾が敵を追いかけて撃墜する。シューティングゲームでは良くみかけるシーンですよね?。自動追尾(ホーミング)ミサイルというやつです。

あれはどういった仕組みで実現しているのでしょうか?。

いろいろなやり方があるかとは思いますが、1つの方法として以下のようなものがあります。

放ったミサイルの位置が移動する毎に、その時のミサイルと敵機を結ぶ直線を計算し、その直線上の点に向けてミサイルを移動する方法です。

homming1(画像URL:deviantart.com 様、illust-AC 様:kaeru-yaさん)

ミサイルと敵機を結ぶ直線上の点を計算するだけなら lerp() 命令で簡単に実現可能です。難しいのは、ミサイルを常に一定の速度で飛ばす事です。

またミサイルが敵を貫通して追い越してしまい、「当たった」と判定されない事にも注意が必要です。

homming2(画像URL:deviantart.com 様、illust-AC 様:kaeru-yaさん)

点uはUFOの座標、点pは1つ前のミサイル座標、点bが現在のミサイル座標です。追尾1から追尾2の状態に遷移するとして、ミサイルの速度(n)は一定である必要があります。

1つ前のミサイル座標(p)と現在のミサイル座標(b)の距離(n)が、1つ前のミサイル座標(p)とUFO座標(u)の距離(t)を追い越していたら、弾が貫通してしまったので「当たり」と判定します。

この処理を実現するための大まかな流れは、以下のようになります。

  1. 点u と点p の距離(t)を計算
  2. 点u と点p の角度(θ)を計算
  3. nを元に内積・外積で点b の座標を計算
  4. n < t なら当たっていないと判断
  5. n > t なら点u = 点b とし、当たりと判断
  6. 自機、敵機、ミサイル描画
  7. 当たりならUFO爆発エフェクト描画

2点間の距離(1の処理)は dist() 命令で簡単に計算できます。

ポイントとなるのは、角度を求める処理(2の処理)と、点bの座標を計算する処理(3の処理)ですよね。

下図をみてください。

homming31(画像URL:deviantart.com 様、illust-AC 様:kaeru-yaさん)

ある2点(pとu)の角度(θ)は、atan2() 命令で求めることが可能です(左側の図)。

また角度(θ)がわかれば、距離( n =ミサイルの速度)をもとに内積と外積の計算を使って、現在のミサイル座標(=点b)を計算することが可能です。

数学が苦手な私は(汗)、内積と外積について上手に説明することができませんが、「円と線分の当たり判定を行うには」の記事が参考になるかもしれません。よろしければ参照してみて下さい。

【構文】

float  rad=  atan2(  float  x,  float  y  ) ;

【パラメータ】

rad  :  角度(ラジアン)
x      :  直角三角形の底辺の長さ
y      :  直角三角形の高さ

【注意】

atan2() はタンジェントの逆関数です。
直角三角形の高さと底辺の長さから、2辺を結ぶ斜辺の角度(θ)を求めます。

atan
求まる角度は度(°)ではなくラジアンです。またPROCESSINGは「時計回り」の角度を基準とします。私達が数学でよく使う「反時計回り」の角度ではないことに注意してください。

radians

【関連記事】


サンプルプログラム

角度を計算する例:

画面中央に戦闘機、戦闘機の斜め上にUFOを描きます。
その後、戦闘機とUFOが作る角度を計算します。

内部で atan2() を利用して角度を計算しています。UFOをマウスで移動させると、角度の表示がかわる事がわかると思います。

<出力サンプル>

homming4(画像URL:deviantart.com 様、illust-AC 様:kaeru-yaさん)

 

追尾ミサイルを打つ例:

角度を計算するサンプルをベースに、少しだけ処理を加えました。

内部で atan2() を利用して角度を計算しています。また内積・外積を利用して弾の座標を計算しています。

実行すると、画面上にフラフラと動く怪しいUFOが出現します。マウスをクリックすると戦闘機から弾が発射されます。

弾は自動追尾ミサイルですので、百発百中となります(笑)。

<出力サンプル>

homming5(画像URL:deviantart.com 様、illust-AC 様:kaeru-yaさん、りなまる さん)

下記はサンプルプログラムをP5.jsで書き直したものです。動作イメージを確認できます。

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。