続・フロッキング

labotic:フロッキング
ということで、五十匹の魚のようなものが蠢くサンプルを公開することにしました。単純で、単調で、おもしろくないです。ソースもついてます。ソース晒すのってちょっと恥ずかしい。
zip形式で圧縮してあります。あと、Windows用バイナリです。マカーのみなさんごめんなさい><
操作説明とかは同梱のテキストファイルに書いてあります。すこしだけ。
ああそうそう、ライセンスはNYSL 0.9982です。煮るなり焼くなり好きにしてください。いや、やっぱり煮るのは禁止にしようかな(冗談)。てか、何か使う人がいるとも思えないけれど。
さて、これだけ書いて説明なし、というのもアレなので、一応メモ。読んで得する人はいるのか?

やってること

さて、なんだかやたらと「それっぽい」動きをするので(贔屓目)、何か難しいことをしているのではないか、という疑念に駆られますが(そうか?)、難しいことをしているのはルーチンとはいまいち関係のない抗力の計算です。水中での抵抗。たぶん、フロッキングよりそちらのほうが難しい。
で、実はそれぞれの魚が従っているルールは三つしかない。

  • 分離(separation)
  • 結合(cohesion)
  • 整列(alignment)

実際は「壁に向かっていきたくない」というきわめて自然な欲求を実現しているのだけど、それはいまいち重要でないのでたぶん割愛。

分離

もっとも単純なルール。NoFlockモードのときにもこのルールだけは作用させています。要するに、「近づき過ぎないようにする」だけ。自分以外の全ユニットとの距離を測って、近くなりすぎたら遠ざかる方向に力をかけます。

結合

視野の中にいる他のユニットの位置の平均に向かって進もうとします。「俺も混ぜろ」みたいな。

整列

視野の中にいる他のユニットの速度ベクトルの平均へ向かおうとします。他人に流されてばかりです。

書くことがないので壁判定のこととか。
最初は、壁との距離に反比例した斥力をかけようとしたのだけど、どうも強すぎるので、わりと一定値にしてしまったり。けどこれはこれで不自然な気もするので、どうしたものか考え中。あと、壁のほうを向いていないときはどんなに近づいても斥力かかりません。そのせいか、ときどき壁に刺さってしばらく固まるのだけど、なぜでしょう。

参考文献

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

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

というか、ほとんどこの本のサンプルのD移植版じゃないか。とくに物理シミュレーション部分なんか自分でもわかってないじゃないか。まったく。