【GameMaker:Studio】内積を使って視野内かどうかの判定をする

投稿者: | 2014年2月28日

内積を使うと、2つのベクトルがなす角度を求めることができます。

002

例えばベクトルaとbが存在する場合、内積の計算は以下のようになります。

  a・b = |a||b|cosθ = ax * bx + ay * by

GameMakerの場合、内積は dot_product() や dot_product_normalised() で求めることができます。

これにより対象のオブジェクトが視野の範囲内にいるかどうかを判定する、という使い方ができます。

例えば、ステルスゲームで敵の視界を作る場合に使える方法です。

■実装方法

実装方法は以下のようになります。

// 視線ベクトル
var x1 = lengthdir_x(1, direction);
var y1 = lengthdir_y(1, direction);
// プレイヤーへの方向ベクトル
var x2 = mouse_x - x;
var y2 = mouse_y - y;

// 正規化して内積を求める
var dot = dot_product_normalised(x1, y1, x2, y2);
// 角度差を取得
var rad = arccos(dot);
self.angle = radtodeg(rad);

if(self.angle > self.view)
{
  // 視界外
  self.is_find = false;
}

自分の向き”direction”を視線としてベクトルを作り、マウス座標をプレイヤー座標として方向ベクトルを作ります。そして、dot_product_normalisedを使用して正規化した内積の値を求めます。この値の逆余弦(arccos)からラジアンが求められるので、角度に変換(radtodeg)すると実際の角度差が求められます。

最後に自分の視界角度”self.view”と比較して視野内にいるかどうかを判定しています。

■サンプルプロジェクト

サンプルはこちらに置いてあります