2. Idea#1: 플로킹 기법의 규칙
• 분리: 주변 보이드들과 충돌하지 않도록 방향을 돌림
• 정렬: 주변 보이드들과 같은 방향을 가리키도록 함
• 응집: 주변 보이드들과의 평균 위치쪽으로 방향을 돌림
• 회피: 보이드가 장애물(천적)과 부딪히지 않도록 함
*회피 규칙은 위 3가지 규칙(분리, 정렬, 응집)이 활성화될 때에만 적용
3. Idea#2: 플로킹은 상태없는 알고리즘
• 각각의 보이드가 어떠한 상태 정보도 가지지 않음
매 순간마다 자신의 주변을 다시 평가할 뿐, 무리에 대한 정
보는 가지지 않음
따라서 다른 무리 행동 알고리즘에 비해 메모리 요구량이
상당히 적음
4. Idea#3: 게임에서의 응용
• 3D 환경 안에서의 유닛 진형 유지
• 동물들의 무리를 움직일 때 훨씬 더 현실감 있음
• 검사 무리들이 다리를 건너거나 장애물을 피해가게 할 수 있음
• 몬스터가 혼자 도망가다가 무리를 만나면 공격해오게 하는 알
고리즘에 적용 가능
7. Idea#1: 벡터와 이동
• 방위: 주어진 객체가 자신의 국소 공간 안에서 가리키는 방향
• 무리의 이동 중 보이드의 방향과 속도를 조정할 때 사용
8. Idea#1: 벡터와 이동
• 특정 보이드의 상반된 행동 조정 방식
벡터 누적이라는 접근 방식을 이용
• :벡터 누적: 각각의 규칙마다 개별적으로 벡터들을 조정하고 그것들을
하나의 변화로 합한 후 최종적으로 보이드에 적용
누적된 변화들이 적절한 비율을 유지하기 위해 단위 벡터로 저장
9. Idea#2: 제한조건
• 보이드의 지각 범위:
하나의 보이드가 얼마나 멀리 떨어진 동료, 장애물을 볼 수 있는지
지각 범위가 크면, 좀더 조직화되고 응집적인 무리가 만들어짐
작으면, 무리가 좀더 산만해지고, 장애물을 피할 때 둘로 나뉠 수 있음
• 보이드의 속도와 최대 속도 변화량
속도 변화는 최대 속도 내의 일정한 비율로만 제한
10. Idea#2: 제한조건
• 무리가 돌아다닐 수 있는 세계
ex) 장애물이 없는 하나의 상자
한 경계면을 지나가면 즉시 그 반대편 면으로 순간이동
일부만 넘어가면 새로운 무리를 구성
11. Idea#3: 클래스 구조와 역할
• 핵심 클래스: CBox, CFlock, Cboid
• 계통 구조
예제에서는 초기화 시점에서 생성하지만, 수명을 부여하고 일정한 시간
이 지나면 죽어서 사라지는 것도 가능
12. Idea#3: 클래스 구조와 역할
• CBox 클래스
이 클래스는 보이드들이 활동 시계의 경계를 넘나드는지를
점검할 때 유용하게 쓰임
13. Idea#3: 클래스 구조와 역할
• CFlock 클래스: 무리에 속한 보이드들을 관리하기 위한 도구
CFlock::ListOfFlocks[]를 통해서 관리(간단한 예제를 위한 정적 배열)
각각의 갱신 주기마다 CFlock::Update() 호출,
새 보이드 추가는 CFlock::AddTo(), 제거는 CFlock::RemoveFrom()
CFlock::GetCount()와 CFlock::GetFirstMember()를 통해 주어진 무리에
대한 상태 정보를 얻을 수 있음
디버깅용으로 더 자세한 정보를 얻기위한 CFlock::PrintData() 존재
14. Idea#3: 클래스 구조와 역할
• 무리는 언제나 생성 가능
• 보이드들은 자신이 어떤 무리에 속해 있는지 알지 못하지만, 무
리 객체는 자신에 속한 보이드들을 알고 있음
15. Idea#3: 클래스 구조와 역할
• CBoid 클래스: 보이드의 이동 방식이나 환경 감지, 행동의 우선 순위 등
보이드의 행동과 존재를 규정(플로킹 알고리즘의 구현부)
CBoid 객체는 자신의 CBoid::FlockIt() 메서드를 통해서 갱신
그 후, CBoid::KeepDistance()(분리 행동), CBoid::MatchHeading()(정렬
행동), CBoid::SteerToCenter()(응집 행동)를 호출, 합쳐서 하나의 단위 벡
터를 만듬. 해당 옵션이 활성화 돼있는 경우 CBoid::FleeEnemies()(회피행
동)도 호출
CBoid::Cruising() 메서드는 보이드가 자신의 무리와 완전히 떨어져 위 조
타 행동들이 이 보이드에게 아무런 영향을 못 끼칠 때 이 메서드를 통해
이동 동기를 얻게 함
16. Idea#3: 클래스 구조와 역할
CBoid::FockIt() 메서드의 끝에서는 각각의 벡터들이 허용된 최고 속도나 속
도 변화를 넘지 않게 함
CBoid::ComputeRPY()는 최종적인 벡터의 변화 결과에 맞게 보이드의 방위
를 조정
CBoid::WorldBound()는 보이드가 Cbox의 경계를 넘으면 그 반대편으로
옮기는 작업을 수행
17. Idea#4: 한계와 개선 방향들
• 이 예제 코드에는 장애물 회피를 구현하지 않음(대신 “천적 무리”라는 형
태로 회피 행동을 표현)
• 보이드가 한 무리에 속하면 무리를 바꾸지 않음
코드를 약간만 개선하면 원래 무리에서 떨어진 보이드들이 새로운 무리를 만들도록
개선 가능(새 CFlock 객체를 생성)
• 실제 게임에선 보이드의 가시 범위를 제한 가능
• 개별 보이드가 수명을 가져 죽게 하는것도 가능
• 한 종류의 무리가 다른 종류의 무리를 먹게 하면 천적도 구현 가능