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