2017年6月8日木曜日

boidの色々な動き 〜自分だけの群衆を作り出せ!〜

前回の記事でboidという,初歩的な群衆シミュレーションのアルゴリズムを紹介しました.bloggerを使っている方はご存知だと思いますが,bloggerの管理画面で,各記事が何回閲覧されたかというのが表示されます.その数が1日2日でこれまでの記事に匹敵するくらいの数になっていて驚いています.Twitterで組み込みやプログラミング分野に非常に影響力のある方に紹介していただいたお陰かもしれません.ありがとうございます.

せっかくですので,もう何回か,boidについて突っ込んだ記事を書いてみたいと思います.(前回の前半で,私のしようもないディズニー話がなければ,一つの記事で済んでいたかもしれませんね.)

前回の記事の続きという形で書きますので,前回の記述内容等を当記事で詳しく引用することは行いません.

1, 条件②の定数について

boidアルゴリズムにおける条件②について,多くのサンプルにはなかった定数での割り算を行っていたのを覚えていますか?これは,そうしないアルゴリズムでは,各個体の動きが不自然になるからでした.

②の部分を以下のように変えます.

vx2-=(x[n]-x[k])/2;
vy2-=(y[n]-y[k])/2;

するとこんな感じ.上が前回のもの.下が今回のものです.



どうでしょう?群れてはいますけどなんか変な感じは否めません.(個人の見解です)

ここで,各条件の計算式はそのままに,個体数(len)を1500,半径(r)を2,近さの閾値(dist)を10に設定すると,このようになります.



いいですね.昔スーパーファミコンに「スーパードンキーコング 謎のクレミス島」というゲームがあって,虫の大群が追いかけてくるというステージがあったのですが,それを思い出す質感です.

2, 速度算出時の重み係数について

各条件の計算結果を結合して速度を算出する時に,重み係数をかけていたのを覚えていますか?この係数の値を変えることで,動きの印象が大きく変わります.今回はProcessingのマウス位置検出機能を使って,重み係数を毎フレームで以下のように計算します.

float r1 = (float)mouseX/Width;
float r2 = abs((float)mouseX-(float)mouseY)/Width;
float r3 = (float)mouseY/Height;

マウス位置で群れの動きに変化が生まれます.


0 件のコメント:

コメントを投稿