27
Game Programming Gems 3.7 플플플 : 플플 플플플 플플플플 플플플 플플

Gpg study3.7

  • Upload
    -

  • View
    53

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Gpg study3.7

Game ProgrammingGems

3.7 플로킹 : 집단 행동을 나타내는 간단한 기법

Page 2: Gpg study3.7

Idea#1: 플로킹 기법의 규칙• 분리 : 주변 보이드들과 충돌하지 않도록 방향을 돌림

• 정렬 : 주변 보이드들과 같은 방향을 가리키도록 함

• 응집 : 주변 보이드들과의 평균 위치쪽으로 방향을 돌림

• 회피 : 보이드가 장애물 ( 천적 ) 과 부딪히지 않도록 함

* 회피 규칙은 위 3 가지 규칙 ( 분리 , 정렬 , 응집 ) 이 활성화될 때에만 적용

Page 3: Gpg study3.7

Idea#2: 플로킹은 상태없는 알고리즘• 각각의 보이드가 어떠한 상태 정보도 가지지 않음

매 순간마다 자신의 주변을 다시 평가할 뿐 , 무리에 대한 정보는 가지지 않음

따라서 다른 무리 행동 알고리즘에 비해 메모리 요구량이 상당히 적음

Page 4: Gpg study3.7

Idea#3: 게임에서의 응용• 3D 환경 안에서의 유닛 진형 유지

• 동물들의 무리를 움직일 때 훨씬 더 현실감 있음

• 검사 무리들이 다리를 건너거나 장애물을 피해가게 할 수 있음

• 몬스터가 혼자 도망가다가 무리를 만나면 공격해오게 하는 알고리즘에 적용 가능

Page 5: Gpg study3.7

플로킹 기법 구현

Page 6: Gpg study3.7

Idea#1: 벡터와 이동• 국소 공간 (local scape – 보이드 자신을 중심으로 하는 공간 )

Page 7: Gpg study3.7

Idea#1: 벡터와 이동• 방위 : 주어진 객체가 자신의 국소 공간 안에서 가리키는 방향

• 무리의 이동 중 보이드의 방향과 속도를 조정할 때 사용

Page 8: Gpg study3.7

Idea#1: 벡터와 이동• 특정 보이드의 상반된 행동 조정 방식

벡터 누적이라는 접근 방식을 이용

• : 벡터 누적 : 각각의 규칙마다 개별적으로 벡터들을 조정하고 그것들을 하나의 변화로 합한 후 최종적으로 보이드에 적용

누적된 변화들이 적절한 비율을 유지하기 위해 단위 벡터로 저장

Page 9: Gpg study3.7

Idea#2: 제한조건• 보이드의 지각 범위 : 하나의 보이드가 얼마나 멀리 떨어진 동료 , 장애물을 볼 수 있는지

지각 범위가 크면 , 좀더 조직화되고 응집적인 무리가 만들어짐작으면 , 무리가 좀더 산만해지고 , 장애물을 피할 때 둘로 나뉠 수 있음

• 보이드의 속도와 최대 속도 변화량

속도 변화는 최대 속도 내의 일정한 비율로만 제한

Page 10: Gpg study3.7

Idea#2: 제한조건• 무리가 돌아다닐 수 있는 세계

ex) 장애물이 없는 하나의 상자

한 경계면을 지나가면 즉시 그 반대편 면으로 순간이동 일부만 넘어가면 새로운 무리를 구성

Page 11: Gpg study3.7

Idea#3: 클래스 구조와 역할 • 핵심 클래스 : CBox, CFlock, Cboid

• 계통 구조

예제에서는 초기화 시점에서 생성하지만 , 수명을 부여하고 일정한 시간이 지나면 죽어서 사라지는 것도 가능

Page 12: Gpg study3.7

Idea#3: 클래스 구조와 역할 • CBox 클래스

이 클래스는 보이드들이 활동 시계의 경계를 넘나드는지를 점검할 때 유용하게 쓰임

Page 13: Gpg study3.7

Idea#3: 클래스 구조와 역할 • CFlock 클래스 : 무리에 속한 보이드들을 관리하기 위한 도구

CFlock::ListOfFlocks[] 를 통해서 관리 ( 간단한 예제를 위한 정적 배열 )

각각의 갱신 주기마다 CFlock::Update() 호출 ,

새 보이드 추가는 CFlock::AddTo(), 제거는 CFlock::RemoveFrom()

CFlock::GetCount() 와 CFlock::GetFirstMember() 를 통해 주어진 무리에 대한 상태 정보를 얻을 수 있음

디버깅용으로 더 자세한 정보를 얻기위한 CFlock::PrintData() 존재

Page 14: Gpg study3.7

Idea#3: 클래스 구조와 역할 • 무리는 언제나 생성 가능

• 보이드들은 자신이 어떤 무리에 속해 있는지 알지 못하지만 , 무리 객체는 자신에 속한 보이드들을 알고 있음

Page 15: Gpg study3.7

Idea#3: 클래스 구조와 역할 • CBoid 클래스 : 보이드의 이동 방식이나 환경 감지 , 행동의 우선 순위 등

보이드의 행동과 존재를 규정 ( 플로킹 알고리즘의 구현부 )

CBoid 객체는 자신의 CBoid::FlockIt() 메서드를 통해서 갱신

그 후 , CBoid::KeepDistance()( 분리 행동 ), CBoid::MatchHeading()( 정렬 행동 ), CBoid::SteerToCenter()( 응집 행동 ) 를 호출 , 합쳐서 하나의 단위 벡터를 만듬 . 해당 옵션이 활성화 돼있는 경우 CBoid::FleeEnemies()( 회피행동 ) 도 호출

CBoid::Cruising() 메서드는 보이드가 자신의 무리와 완전히 떨어져 위 조타 행동들이 이 보이드에게 아무런 영향을 못 끼칠 때 이 메서드를 통해 이동 동기를 얻게 함

Page 16: Gpg study3.7

Idea#3: 클래스 구조와 역할CBoid::FockIt() 메서드의 끝에서는 각각의 벡터들이 허용된 최고 속도나 속도 변화를 넘지 않게 함

CBoid::ComputeRPY() 는 최종적인 벡터의 변화 결과에 맞게 보이드의 방위를 조정

CBoid::WorldBound() 는 보이드가 Cbox 의 경계를 넘으면 그 반대편으로 옮기는 작업을 수행

Page 17: Gpg study3.7

Idea#4: 한계와 개선 방향들• 이 예제 코드에는 장애물 회피를 구현하지 않음 ( 대신 “천적 무리”라는 형태로 회피 행동을

표현 )

• 보이드가 한 무리에 속하면 무리를 바꾸지 않음

코드를 약간만 개선하면 원래 무리에서 떨어진 보이드들이 새로운 무리를 만들도록 개선 가능 ( 새 CFlock 객체를 생성 )

• 실제 게임에선 보이드의 가시 범위를 제한 가능

• 개별 보이드가 수명을 가져 죽게 하는것도 가능

• 한 종류의 무리가 다른 종류의 무리를 먹게 하면 천적도 구현 가능

Page 18: Gpg study3.7

플로킹 알고리즘코드 정의

Page 19: Gpg study3.7

Box 클래스

Page 20: Gpg study3.7

Flock 클래스

Page 21: Gpg study3.7

Flock 클래스

Page 22: Gpg study3.7

Boid 클래스

Page 23: Gpg study3.7

Boid 클래스

Page 24: Gpg study3.7

Boid 클래스

Page 25: Gpg study3.7

Boid 클래스

Page 26: Gpg study3.7

Boid 클래스

Page 27: Gpg study3.7

Boid 클래스