놀이
상어가 커서를 따라갑니다. 꾹 누르면 잠깐 돌진합니다. 물고기 떼는 겁먹으면 빨라지고 갈라져 도망칩니다. 45초 동안 몇 마리 잡을까요?
프리셋
세 가지 규칙의 세기
거리와 속도
실행
가장자리
보기
보이드를 짧게 클릭하면 그 보이드의 시야 반경, 분리 거리, 이웃이 강조되고 세 힘이 화살표로 보입니다. 빈 곳을 클릭하면 해제됩니다.
보이드(Boids)는 1986년 크레이그 레이놀즈가 만든 군집 모형입니다. 지휘하는 새는 없습니다. 각 보이드는 가까운 이웃만 보고 세 가지 규칙을 따릅니다. 떼 전체의 움직임은 그 결과로 생깁니다.
0. 보이드 하나가 아는 것
위치와 속도만 가집니다. 시야 반경 안의 이웃(초록)만 셉니다.
① 분리: 너무 가까우면 비켜라
분리 거리 안의 이웃마다 (나 − 이웃) / 거리²를 더합니다. 가까울수록 세게 밀립니다.
② 정렬: 이웃과 같은 쪽으로
이웃 속도의 평균을 구해서 그 방향으로 핸들을 틉니다.
③ 응집: 무리 가운데로
이웃 위치의 평균(무게중심)을 향해 갑니다.
④ 조향: 원하는 속도 − 지금 속도
각 규칙은 "가고 싶은 방향 × 최대 속도"를 만듭니다. 거기서 지금 속도를 빼면 조향력이 됩니다. 조향력은 최대 힘으로 자르고, 세 힘에 슬라이더 세기를 곱해 더합니다. 그 합을 속도에 더한 뒤 속도를 최대 속도로 자릅니다. 최대 힘이 작으면 크게 돌고, 크면 홱홱 꺾습니다.
⑤ 빠르게 이웃 찾기: 공간 격자
화면을 시야 반경 이상 크기의 칸으로 나누고, 매 프레임 보이드를 칸에 넣습니다. 이웃은 내 칸과 둘레 8칸에만 있을 수 있으니 9칸만 뒤집니다. 1000마리 모두를 서로 비교하는 일(약 100만 번)이 고르게 퍼져 있으면 수천 번으로 줄어듭니다.
⑥ 가장자리
이어짐: 오른쪽으로 나가면 왼쪽에서 들어옵니다. 거리도 "더 짧은 쪽"으로 재서, 경계 너머의 이웃도 이웃으로 봅니다. 격자 칸도 반대편과 이어집니다.
튕기기: 벽에 닿으면 그 축의 속도를 뒤집습니다.
⑦ 상어 놀이: 네 번째 규칙 "포식자 피하기"
상어가 겁나는 거리 안에 들어오면 상어 반대쪽으로 도망가는 힘이 생깁니다. 가까울수록 이 힘이 세지고, 겁먹은 동안은 최대 속도도 1.7배가 됩니다. 이 규칙도 각자 따로 계산할 뿐인데, 떼가 상어 앞에서 둘로 갈라졌다가 뒤에서 다시 합쳐집니다. 실제 물고기 떼의 "분수 효과"와 비슷합니다. 정렬이 강하면 한 마리의 공포가 떼 전체로 번집니다.
코드 어디서?
파일 안 step() 함수에 ① 분리, ② 정렬, ③ 응집, ④ 조향·제한, ⑤ 공간 격자, ⑥ 가장자리, ⑦ 포식자 주석을 달아 두었습니다.
출처: Craig Reynolds, "Flocks, Herds, and Schools: A Distributed Behavioral Model" (SIGGRAPH 1987) · red3d.com/cwr/boids