250 likes | 657 Views
플로킹 : 집단 행동을 흉내내는 간단한 기법. (GEMS1- 3.7 장 ). 개요. 플로킹 (flocking 또는 swarming, herding) 1987 년 SIGGRAPH 에 제출된 Craig Reynolds 의 “ Flocks, Herds, and Schools : A Distributed Behavioral Model ” 이라는 논문에서 처음 등장한 기법
E N D
플로킹 : 집단 행동을 흉내내는 간단한 기법 (GEMS1- 3.7장)
개요 • 플로킹 (flocking 또는 swarming, herding) • 1987년 SIGGRAPH에 제출된 Craig Reynolds의 “Flocks, Herds, and Schools : A Distributed Behavioral Model”이라는 논문에서 처음 등장한 기법 • 자동화된 에이전트(boid라고 함)들의 집단이 새떼나 물고기떼, 또는 벌떼와 비슷한 집단 행동을 보이도록 만들기 위한 규칙 제시 => 조타 행동 (steering behavior)
조타 행동(steering behavior) • 분리 (Separation) • 주변 보이드들과 충돌하지 않도록 방향을 돌린다 • 정렬 (Alignment) • 주변 보이드들과 같은 방향을 가리키도록 한다 • 응집 (Cohesion) • 주변 보이드들과의 평균 위치쪽으로 방향을 돌린다 • 회피 (Avoidance) • 지역•장애물이나 적들에 부딪히지 않도록 방향을 조정한다
분리 (Separation) • 보이드가 주변의 다른 보이들과 적당한 거리를 유지하도록 하는 것 • 응집규칙만 있다면 보이드들은 서로 부딪히게 되는데, 그것을 방지하는 것이 분리 규칙 • 이 글에서는 … • 무리의 각 보이드마다 주변 보이들과의 거리를 판단하고 적당한 거리를 유지할 수 있도록 방향을 돌리는 방식으로 이 규칙을 구현함
정렬 (Alignment) • 보이드가 주변의 다른 개체들과 동일한 방향(또는 속도)을 유지하도록 하는 것 • 이 규칙에 의해 보이드들이 모인 무리가 마치 하나의 보이드처럼 움직이게 됨 • 이 글에서는 … • 보이드의 방향과 속도를 주변 보이드들의 평균적인 속도와 방향으로 조정함으로써 이 규칙을 구현함
응집 (Cohesion) • 보이드들을 하나의 무리로써 모이게 하는 역할 • 이 글에서는 … • 주변 보이드들과의 평균 위치로 갈 수 있도록 보이드의 방향과 속도를 조정함으로써 이 규칙 구현
회피 (Avoidance) • 보이드가 장애물과 부딪히지 않도록 하기 위한 것 • 보이드가 어느 정도의 거리를 내다 보고 장애물이 존재하면 그것을 피할 수 있는 쪽으로 방향을 조정함으로써 구현 • 이 규칙은 장애물뿐만 아니라 어떠한 천적에 해당하는 에이전트(토끼의 경우 늑대, 비둘기 경우 매)가 있을 때에도 적용
상태 없는 알고리즘 • 각각의 보이드는 무리에 대한 어떠한 정보(무리가 어디로 가는 지 등)도 가지지 않는다는 점 • 보이드가 어떠한 상태 정보도 가지지 않는다는 점에서 플로킹은 ‘상태없는(stateless)’알고리즘 • 각각의 보이드는 매 순간마다 자신의 주변을 다시 평가할 뿐, 무리에 대한 정보는 아예 가지고 있지 않음 • 플로킹 이외의 접근 방식을 이용한 무리 행동 알고리즘에 비해 메모리 요구량이 대단히 적음 • 임기 응변적인 행동 (emergent behavior) • 무리의 보이드들은 무리가 어디로 가는 지에 대해서는 전혀 알지 못하지만, 모든 보이드들은 하나의 무리로서 움직이고, 장애물과 적들을 피하며, 다른 보이드들과 보조를 맞춰서 유동적으로 이동하게 됨
게임에서의 응용 • 플로킹 • 유닛들의 집단 이동을 위한 도구 • 게이머에게 좀 더 현실감 있는 게임 환경을 제공하는 수단 • 많은 상용 게임에서 이미 사용 • Unreal(Epic)과 Half-Life(Sierra)는 먼스터들이나 또는 좀 덜 위험한 생물들(물고기나 새)의 움직임에 플로킹을 적용함 • Enemy Nations(Windward Studio)는 3D 환경 안에서의 유닛 진형 유지나 이동에 수정된 플로킹 알고리즘 적용 • RTS 게임이나 RPG에서 동물들의 무리를 움직일 때 간단한 스크립팅보다는 플로킹을 사용하는 것이 훨씬 더 현실감 있는 결과를 얻을 수 있음 • 궁수들이나 검사들이 다리를 건너던가 기둥을 돌아가게 할 때 적용할 수도 있음 (?) • 1인칭 슈팅 게임에서, 던젼 안의 먼스터들이 혼자 떨어져 있을 때에는 플레이어를 피하다가 무리를 이루면 플레이어를 공격하게 만드는 데에도 사용
구현 - 벡터와 이동 • 국소 공간(local space –보이드 자신을 중심으로 하는 공간)이라는 개념 (그림 3.7.2) • 앞 –양의 z축 • 왼쪽 –양의 x축 • 위 –양의 y축
방위 (orientation)라는 개념(그림 3.7.3) • Roll : 국소 z축(앞,뒤) • Pitch : 국소 x축(좌,우) • Yaw : 국소 y축(위,아래) • 무리의 이동 중 보이드의 방향과 속도를 조정할 때 방위 개념을 주로 사용 • 하나의 보이드가 가지는 상반된 요구들을 조정하는 방식 • 네 가지 규칙들은 모두 동일한 중요성을 가짐 (예) 한 마리의 비둘기는 장애물이나 적들과 부딪히고 싶지 않겠지만, 그렇다고 동료들과 떨어지고 싶지도 않음. 그러나 생사가 달린 상황이라면 다를 수 있음(예를 들어 매에 쫓긴다면 무리에 대해서는 생각할 겨를이 없음)
벡터 누적 방식 • 각각의 규칙마다 개별적으로 벡터들을 조정하고, 그것들을 하나의 변화벡터로 합한 후 그것을 최종적으로 보이드의 이동에 적용하는 것 • 누적된 변화들이 적절한 비율을 유지할 수 있도록 하기 위해, 편의상 이 변화 벡터는 하나의 단위 벡터로 저장됨 • 이 방법은 각각의 조타 행동이 보이드의 최종 이동 변화에 부분적인 영향을 미치게 함으로써 둘 또는 그 이상의 상반되는 요구들을 만족시킴
제한 조건들 • 보이드의 이동과 반응에 영향 미치는 제한 조건 (1) 각 보이드의 ‘지각 범위’ • 하나의 보이드가 얼마나 멀리 떨어진 동료보이드 또는 장애물을 볼 수 있는지 결정하는 크기 • 이 범위가 크면 좀 더 조직화되고 응집적인 무리가 만들어지며, 적이나 장애물도 좀 더 효과적으로 피할 수 있음 • 이 범위가 작으면 무리가 좀더 산만해지며, 장애물을 거쳐 갈 때 무리가 둘로 나눠지는 등의 행동을 보이기도 함 (2) 보이드의 속도와 최대 속도 변화량 • 실세계에서도 이동 속도나 선회 속도 같은 능력에 따라 한 개체가 무리로부터 이탈하거나 제대로 무리를 따라가게 됨 (여기서는 속도만 고려, 가속도는 무시함) • 속도 변화를 제한하지 않으면 무리에서 떨어진 보이드가 비정상적으로 빠른 속도로 무리를 따라 잡는 현상이 생길 수 있음 • 속도 변화의 제한은 장애물을 피하기 위해서 방향을 틀거나 속도를 낮추는 행동에도 영향을 미칠 수 있음 (속도 변화를 제한하지 않으면, 장애물 앞에서 갑자기 멈춰서 잽싸게 방향을 바꾸는 비현실적인 행동이 일어남)
세계에 대한 제한 • 책 예제 • 보이드가 돌아다니는 세계는 장애물이 없는 하나의 상자 • 보이드가 상자의 한 경계면을 지나가면 즉시 그 반대편 면으로 순간 이동굄 • 경계를 넘어도 보이드의 속도와 방위는 그대로 유지 • 무리가 상자의 경계면에 너무 가깝게 이동하다가 일부 보이드들만 반대편으로 넘어가게 되면 그 보이드들은 원래의 무리를 따라잡지 못하게 되며, 결과적으로 새로운 무리를 구성하게 됨
코드 • 플로킹 예제의 핵심 클래스 • CBox • CFlock : 임의의 개수의 무리들 • CBoid : 임의 개수의 개체들
CBox 클래스 보이드들이 활동 세계를 넘나드는 지를 점검할 때 유용하게 쓰임
CFlock 클래스 • 보이드들의 무리 의미 • 무리 자체를 표현하기 위한 수단이라기 보다는 무리에 속한 보이드들을 관리하기 위한 도구 • 무리를 관리하는 데 다양한 함수 제공 • 절차 • 무리 만들어짐 • 거기에 보이드들이 추가됨 • Cflock::ListOfFlocks[]를 통해서 관리
CBoid 클래스 • 보이드의 이동 방식이나 환경을 감지하는 방식, 행동의 우선 순위 등 한 보이드의 행동과 존재를 규정하는 모든 측면들을 처리 • CBoid::KeepDistance –분리 행동 • CBoid::MatchHeading –정렬 행동 • CBoid::SteerToCenter –응집 행동 • CBoid::FleeEnemies –회피 행동 • CBoid::ComputeRPY –방위 조정 함수