見出し画像

ボイド (Boids) もどきをベクター・フィールドで作ってみよう

みんな大好き「ベクター・フィールド」を用いて、Processing でボイド風のアニメーションを作ってみようという試みです。

ベクター・フィールドについてはこちらをご参照ください。

この記事は全文無料でお読みいただけます。もしお気に召しましたら投げ銭お願いしますね。😉✨

画像1

ボイド (Boids) って何?

ボイド (Boids) は鳥もどき (bird-oid) から名付けられた人口生命シミュレーションの一種で、その名のとおり鳥の群れのような複雑な動きを再現できるプログラムです。
今回ボイド (Boids) もどきを作ろうということなので「鳥もどきもどき」を作るわけですね。

映画ロード・オブ・ザ・リングの戦闘シーンの群衆 CG でもボイド (Boids) を元にしたプログラムが使われたとか。
Boids の原理とコードを知りたければこの本に詳しく書いてあります。

チューリングパターンとかも載ってて、この本お勧めです。👍

画像2

それでなんでベクター・フィールド?

ある日、ベクター・フィールドの静止画描画コードをいじってアニメーション化しようとしていました。

やってるうちに『流れの全体を描画するんじゃなくて、一部だけを移動しながら描画するとどうなるだろう?』とやってみたところ…

あれ?これなんだか Boids みたい!と思ったのがきっかけです。

画像3

コードの勘所

基本としてベクター・フィールドは座標の位置をもとに移動方向を計算するので、同じ座標に来たパーティクルのルートはその先全く同じになってしまいます。
かといって、基本を無視して全く違う計算にするとてんでばらばらのランダムな動きになってしまいます。

計算の核にはパーリンノイズを使っています。
そのパラメータをこのように座標だけにすると (x, y) が同じなら同じノイズ値になり、移動方向の同じでその計算結果の座標も同じで結局同じルートになってしまうというわけです。

noise(x, y);

その問題はパーティクル毎に異なるノイズ値が得られれば解決します。
n に何個目のパーティクルかを入れるとか。

noise(n, x, y);

でもこれだとてんでばらばら。

これは n の差が大きすぎるからなので、こんな風に調整してやります。

noise(n * 0.1, x, y);


それでもいい感じの動きにするのはなかなか難しい。

画像4

いい感じのサンプルコード

なんとか調整していい感じになったのがこれです。

Boids の動きの肝 分離、整列、結合 は全く実装していないので完全に雰囲気だけの代物ですけど、なかなか群れっぽいでしょ?

サンプルコードはこちらに掲載しましたのでどうぞご利用ください。


動きの計算を完全に間違えたツイートが一番伸びるのもまた一興ですね。😉


ここでこの記事はおしまいです。もしこの記事がお気に召しましたら投げ銭お願いします。😉✨


ここから先は

0字

¥ 100

この記事が面白かったらサポートしていただけませんか? ぜんざい好きな私に、ぜんざいをお腹いっぱい食べさせてほしい。あなたのことを想いながら食べるから、ぜんざいサポートお願いね 💕