Когда вы смотрите на стаю скворцов на закате, кажется, что это один организм с общей волей. На самом деле там нет лидера: каждая птица следит примерно за семью ближайшими соседями — независимо от того, как далеко они оказались. Это измерили Ballerini и соавторы в 2008 году по стереосъёмкам стай над Римом (PNAS).
Сам алгоритм старше. Крейг Рейнольдс собрал три правила ещё в 1987-м (SIGGRAPH '87). Само слово boids — от bird-oid object:
— separation — отталкивайся от того, кто оказался слишком близко.
— alignment — подстраивай свою скорость под среднюю скорость соседей.
— cohesion — тянись к их центру масс.
Собственно, в Unity это делается так:
Vector3 sep = Vector3.zero, ali = Vector3.zero, coh = Vector3.zero;
int count = neighbors.Count;
foreach (var other in neighbors) {
Vector3 d = transform.position - other.position;
if (d.sqrMagnitude < sepRadius * sepRadius) sep += d.normalized;
ali += other.velocity;
coh += other.position;
}
velocity += wSep * sep
+ wAli * (ali / count - velocity)
+ wCoh * (coh / count - transform.position);
velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
transform.position += velocity * Time.deltaTime;
Магия — в балансе весов. Большой wSep — юниты разлетаются в пыль. Большой wCoh — слипаются в шарик и стоят. Всё интересное — где-то между.
В играх это стаи в Subnautica, орда Freakers в Days Gone, Swarm Engine в World War Z. Конечно же, в боевой реализации есть ещё seek к цели и avoidance препятствий — но базовая стая держится на этих трёх правилах. 🔥
#мат_геймдев #МатРазбор #AI #biomimicry
