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 にする — 塊が固まって回転し始める.ミルと呼ばれる渦状態に近い.

三つの規則の張り合いが群れらしさを作っていることが,数十秒いじるだけで体感できるはずだ.

なぜこれが面白いか

局所規則から大域的な秩序が生まれる,というのは自己組織化の教科書的な例だが,実装して手で触ると解像度が変わる.パラメータ空間のどこに「群れらしさ」が住んでいて,どこで壊れるのか — その境界を探ること自体が,モデルを理解するということなのだと思う.