[플로킹, 생물의 집단행동 구현]

- 우종하(deepseas(AT)sogang.ac.kr)

 


    - 소스코드 [Down]

    - 자바 Runtime [Down] : 애플릿이 실행이 안될 경우 설치, 설치후 익스플로어 재실행

 

    - Craig Reynolds의 플로킹 데모

 

플로킹(Flocking)의 개요

플로킹은 1987년 SIGGRAPH에 제출된 Craig Reynolds의 "Flocks, Herds, and Schools: A Distributed Behavioral Model"이라는 논문에서 처음 등장한 기법이다.

이 논문에서 Reynolds는 자동화된 에이전트(보통 boid라고 부른다)들의 집단이 새떼나 물고기떼, 또는 벌떼와 비슷한 집단행동을 보이도록 만들기 위한 세가지 규칙을 제시했다. Reynolds는 이 규칙들을 조타 행동(steering behavior) 규칙이라고 불렀다.

 

플로킹(Flocking)의 규칙 - 조타 행동(Steering Behavior)

첫 번째, 분리(Separation) 규칙.

보이드가 주변의 다른 보이드들과 적당한 거리를 유지하도록 하는 것이다. 응집 규칙만 있다면 보이드들은 서로 부딪히게 되는데, 그것을 방지하는 것이 분리 규칙이다. 무리의 각 보이드마다 주변 보이드들과의 거리를 판단하고 적당한 거리를 유지할 수 있도록 방향을 돌리는 방식으로 이 규칙을 구현한다.

두 번째, 정렬(Alignment) 규칙.

보이드가 주변의 다른 개체들과 동일한 방향과 속도를 유지하도록 하는 것이다. 이 규칙에 의해 보이드들이 모인 무리가 마치 하나의 보이드처럼 움직이게 된다. 보이드의 방향과 속도를 주변 보이드들의 평균적인 속도와 방향으로 조정함으로써 이 규칙을 구현한다.

세 번째, 응집(Cohesion) 규칙.

보이드들을 하나의 무리로써 모이게 하는 역할을 한다. 주변 보이드들과의 평균 위치로 갈 수 있도록 보이드의 방향과 속도를 조정함으로써 이 규칙을 구현한다.

네 번째, 회피(Avoidance) 규칙.

이후의 구현과 논문들에서, Reynolds는 또 하나의 규칙을 추가하였다.

보이드가 장애물과 부딪히지 않도록 하기 위한 것이다. 이는 보이드가 어느 정도의 거리를 내다 보고 장애물이 존재하면 그것을 피할 수 있는 쪽으로 방향을 조정함으로써 구현된다. 이 규칙은 장애물 뿐만 아니라 어떠한 천적에 해당하는 에이전트가 있을 때에도 적용될 수 있다.

 

플로킹(Flocking)의 특징 - 상태 없는 알고리즘

플로킹의 가장 주목할 만한 특징은, 각각의 보이드는 무리에 대한 어떠한 정보(무리가 어디로 가는지 등)도 가지지 않는다는 점이다. 보이드가 어떠한 상태 정보도 가지지 않는다는 점에서 플로킹은 '상태 없는(stateless)' 알고리즘이다.

각각의 보이드는 매 순간마다 자신의 주변을 다시 평가할 뿐, 무리에 대한 정보는 아예 가지고 있지 않다. 따라서 플로킹 이외의 접근 방식을 이용한 무리 행동 알고리즘에 비해 메모리 요구량이 대단히 적다.

플로킹은 본질적으로 임기웅변적인 행동(emergent behavior)이다. 무리의 보이드들은 무리가 어디로 가는지에 대해서는 전혀 알지 못하지만, 모든 보이드들은 하나의 무리로서 움직이고, 장애물과 적들을 피하며, 다른 보이드들과 보조를 맞춰서 유동적으로 이동하게 된다.

 

게임에서의 응용

플로킹은 유닛들의 집단 이동을 위한 도구가 될 수 있으며, 또한 게이머에게 좀 더 현실감 있는 게임 환경을 제공하는 수단이 될 수 있다. 이미 많은 상용 게임들이 플로킹을 사용했다. 예를 들어서 Unreal과 Half-Life는 몬스터들이나 또는 좀 덜 위험한 생물들(물고기나 새 등)의 움직임에 플로킹을 적용했다.

RTS(리얼타임 시뮬레이션) 게임이나 RPG(롤플레잉 게임)에서 동물들의 무리를 움직일 때 간단한 스크립팅(일일이 움직임을 미리 지정하여 구현하는 것)보다는 플로킹을 사용하는 것이 훨씬 더 현실감 있는 결과를 얻을 수 있다.

또한 일단의 궁수들이나 검사들이 다리를 건넌다던가 기둥을 돌아가게 할 때 적용할 수도 있을 것이다. 그리고 1인칭 슈팅 게임에서, 던전 안의 몬스터들이 혼자 떨어져 있을 때에는 플레이어를 피하다가 무리를 이루면 플레이어를 공격하게 만드는 데에도 사용할 수 있을 것이다. 응용 방법은 얼마든지 생각해 낼 수 있다.

 

[참고자료]

    - Game Programming Gems 1권, p.401 ~ p.415
    - Craig Reynolds, http://www.red3d.com/cwr/

 

[1]