読者です 読者をやめる 読者になる 読者になる

Dr. 三日坊主

日々の勉強の記録 AIそして英語

ゲームAIスタディ-追跡

挙動を確認できる下地を作ったので、今回からは本とサンプルを読みながら実際に実装してみる。
今回は、追跡のアルゴリズム
追いかけられる役をターゲット。追いかける役をプレデターと呼ぶことにする。

手始めに、なにも障害物などのない空間で考える。

走って追跡

プレデターが人間など、その場ですぐに方向を変えられるようなものの場合はとても簡単。
プレデターは、ターゲットの場所を把握すると、自分の場所からターゲットへの場所へ向かうベクトルをそのまま速度にしてやればよい。
ターゲットが動いても、そのたびに速度を更新すればずっと追いかけていける。

// キャラクタークラス.
class Character {
  ...
  // targetを設定.
  void SetTarget( Vector targetPos );
  void Update( float dt );
  ...

  Vector Pos;  // 位置.
  Vector Vel;  // 速度.
  float speed; // 速さ.

  ...
};

void Character::SetTarget( Vector targetPos ) {
   	Vector newVel = targetPos - m_pos;
	newVel.normalize();
	Vel = newVel * speed;
}

void Character::Update( float dt ) {
   	Pos += Vel*dt;
}

乗り物で追跡

しかし、乗り物で追跡する場合はそうはいかない。
もし後ろにターゲットがいることがわかったら、方向転換をしてから追いかける必要があるし、
追跡中にターゲットが移動して方向を変えなければならないとき、慣性力によってすぐには曲がれず、すこし遠回りに弧を描いて曲がるほうが自然に見える。

本の中では、前進する力自身を回転させる力を操作して操縦する乗り物を実装している。
実装には基本的な物理学の知識が必要だが、とても汎用性が高く、車や船、ロケットなどの挙動もこれで実装できてしまう。

今回はこの乗り物を使って追跡のアルゴリズムを実装してみた。
仕組みはとても簡単。プレデターからみて、ターゲットが右側にいれば右回転するように力を与え、左側にいれば左回転するようにしているだけ。
本に載っているように、乗り物にくっついた局所座標(ローカル座標)と、ゲーム画面の座標(グローバル座標)を分けると、計算がとても楽になった。


動きはこんな感じ。

下のロケット(ターゲット)は、マウスがクリックした場所を目指して飛び、
左のロケット(プレデター)は、ターゲットを追いかけるように飛ぶようにした。
プレデターは、ターゲットより1.5倍速く動けるようにしてある。
目標の位置は毎フレームセットし直して、その都度速度を更新している。

急な方向転換はできず、慣性ですこし遠回りしながら方向を変えているところが乗り物として自然に見えるかな。


今日はここまで


ゲーム開発者のためのAI入門

ゲーム開発者のためのAI入門