フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

こんばんは。夏休み中は到底無理でしたが、じわじわ進んでます。今回も(個人的に)革新的な進歩が見られましたよ。それは、「視野判定三点セット」です!前回チラッと言いましたがAI製作には視野判定が必要です。また、視野判定を作ろうとして思ったのですが、これを「プレイヤーが見える敵」にも応用すれば、壁に隠れて見えない敵の描画を省略でき、かなり体感FPSを上げられるはずです。そんなこんなで要求仕様が複雑になりましたが、なんとか視野判定が完成しましたのでそれぞれについて報告します。

①敵用視野判定システム「プレイヤーの中心が見えるか」
一番簡単な判定です。自分の座標から相手の座標までのベクトルが、どの壁にも遮られないのを確認するだけなので、外積で二発です(一発です!とはいきませんが…)。

②同行者用視野判定システム「プレイヤーが完全に見えるか」
同行者の場合プレイヤーを追うことができる精度が必要なので、①のような判定では細かい角で簡単にハマってしまって不十分です。これは、プレイヤーの姿が少しでも欠けたときにすぐ見失わせることで緩和できます。数学的には、自分から相手の左右への接線について①と同じことを行い、少なくとも一本が遮られた時に隠れたことにすればOKです。これて併せて見失った場合は最後に見えた地点に向かうようにすれば、十分実用性のある追跡AIができると思います。

③プレイヤー用視野判定システム「キャラがちょっとでも見えるか」
今回の視野判定で最難関です。ちょっとでも見えるっていうのは①や②と比べて遥かに考えにくくなります(私はね)。最初は②を応用して、「少なくとも一本」を「二本とも」に変えただけのアルゴリズムで試しました。しかしこれだと、スリット状の壁に左側と右側が隠されただけで成立してしまい、中央部は見えるはずなのに消えているという幽霊状態になります…(笑)ならば!と中央にも同じ処理を足し、三本遮られた時のみに消すようにしましたがこれもダメです。同じくスリットの両端それぞれに、左と中央あるいは右と中央を遮られた場合、やはりスリットの隙間から見えるはずの部分がハブられます。では五本に増やして…としていっても、これは本質的には解決しません。どうしてもこれでやるなら、無限本のベクトルが必要だからです。
ではどうするか?ちょっと違う切り口で攻めてみました。一回②に戻って、二本のベクトルで判定します。一枚の壁に二本とも遮られたら当然見えないので判定終了です。問題は一本だけ遮られた場合です!ここで、遮られたベクトルを、遮られない角度まで回転移動させます。回転の中心は自分です。すると自分から相手の左右へのベクトルが近づき、見かけの相手の大きさが小さくなります。そして次の壁からはこの小さな判定モデルで判定します。また一本だけ当たったら小さくします。こうしていって一度も「一枚の壁に二本とも遮られる」状態にならなければ可視と判定します。こうすれば!どんなにチラッとであっても、見えるものは見えると判定され、見えないものは見えないことになります!これを使ってキャラの描画を適宜省略すると…なんと!ネットブックで敵を7体出しても、敵が一人も映っていなければ、60FPSでました!!!!!(ちなみにこの省略を行わないと、敵が映っていようがいまいが常時15FPS程度になります…)敵1~2体映っていても30FPSくらいは出ます。これなら、普通の遊び方ならネットブックでも実用レベルじゃないでしょうか。

衝突判定と違ってこういう視野判定は直接の資料が少ないのが悩みどころです。衝突判定に近いものはありますが、「少しでも見えたら」の概念を数式(しかも計算が速くなくてはならない)にする方法は見つけられませんでしたし、自分ではなおさらなかなか思いつきませんでした。明日からほんとにほんとにAI作ります。ではおやすみなさい。
関連記事

[2014/09/24 23:47] | 不死女 -Immortal girl-
|
コメント:
この記事へのコメント:
コメント:を投稿
URL:

パスワード:
非公開コメント: 管理者にだけ表示を許可
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。