2026-08-15
ボイドで遊ぶ — 群れをつくる三つの規則
#q5js #simulation #creative-coding
ムクドリの群れが夕空で一つの生き物のようにうねるとき,そこに指揮者はいない.Craig Reynolds が 1987 年に示したボイド(boids)モデルは,個体が近傍だけを見て動く三つの規則 — 分離(separation)・整列(alignment)・結合(cohesion) — から,あの群れの振る舞いが立ち上がることを示した.
下のデモは q5.js(p5 互換 API の軽量・高速実装)によるもので,各規則の重みをスライダーでリアルタイムに変えられる.カーソルを載せると群れが寄ってきて,押している間は逃げていく.
三つの規則
各ボイドは知覚半径内の仲間だけを見て,進みたい方向を決める.操舵は Reynolds の steer = desired − velocity に従い,力の上限を課すことで,急旋回のない生き物らしい動きになる.
// 知覚半径内の仲間から3つの「望み」を合成する
if (nSep > 0) acc += steer(separationDir) * wSeparation; // ぶつかりそうなら離れる
if (nNear > 0) {
acc += steer(meanVelocity) * wAlignment; // みんなの向きに合わせる
acc += steer(centroid - self) * wCohesion; // 群れの中心に寄る
}
velocity = limit(velocity + acc, MAX_SPEED);
大事なのは,どの個体も「群れの形」を知らないことだ.知っているのは半径 60px の近所のことだけで,群れ全体のうねりは誰も設計していない.
スライダーで壊してみる
- 分離だけを 0 にする — 個体が重なり合い,群れが一本の紐のように潰れる.
- 整列だけを 3 にする — 全員が同じ向きに揃い,ただの平行移動になる.ゆらぎが消える.
- 結合だけを 3 にする — 塊が固まって回転し始める.ミルと呼ばれる渦状態に近い.
三つの規則の張り合いが群れらしさを作っていることが,数十秒いじるだけで体感できるはずだ.
なぜこれが面白いか
局所規則から大域的な秩序が生まれる,というのは自己組織化の教科書的な例だが,実装して手で触ると解像度が変わる.パラメータ空間のどこに「群れらしさ」が住んでいて,どこで壊れるのか — その境界を探ること自体が,モデルを理解するということなのだと思う.