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

More Related Content

Viewers also liked

[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티Sehyeon Nam
 
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)SeungMin Yang
 
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)SeungMin Yang
 
[12 0210] gpg 2.3.7 전략적 판단 기법
[12 0210] gpg 2.3.7 전략적 판단 기법[12 0210] gpg 2.3.7 전략적 판단 기법
[12 0210] gpg 2.3.7 전략적 판단 기법SeungMin Yang
 
[0604 석재호]광택성사전필터링
[0604 석재호]광택성사전필터링[0604 석재호]광택성사전필터링
[0604 석재호]광택성사전필터링Jaeho Seok
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규ChangKyu Song
 
[NDC2014] 반응적 라이브 개발
[NDC2014] 반응적 라이브 개발[NDC2014] 반응적 라이브 개발
[NDC2014] 반응적 라이브 개발ChangKyu Song
 
GPG Study 4.3 카메라 제어기법
GPG Study 4.3 카메라 제어기법GPG Study 4.3 카메라 제어기법
GPG Study 4.3 카메라 제어기법연우 김
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기ChangKyu Song
 
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산Taeung Ra
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3david nc
 

Viewers also liked (14)

op
opop
op
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
 
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
 
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
 
[12 0210] gpg 2.3.7 전략적 판단 기법
[12 0210] gpg 2.3.7 전략적 판단 기법[12 0210] gpg 2.3.7 전략적 판단 기법
[12 0210] gpg 2.3.7 전략적 판단 기법
 
[0604 석재호]광택성사전필터링
[0604 석재호]광택성사전필터링[0604 석재호]광택성사전필터링
[0604 석재호]광택성사전필터링
 
GPG 1권 4.12 VIPM
GPG 1권 4.12 VIPMGPG 1권 4.12 VIPM
GPG 1권 4.12 VIPM
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
[NDC2014] 반응적 라이브 개발
[NDC2014] 반응적 라이브 개발[NDC2014] 반응적 라이브 개발
[NDC2014] 반응적 라이브 개발
 
GPG Study 4.3 카메라 제어기법
GPG Study 4.3 카메라 제어기법GPG Study 4.3 카메라 제어기법
GPG Study 4.3 카메라 제어기법
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
Gpg study5.5
Gpg study5.5Gpg study5.5
Gpg study5.5
 
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
 

More from 세빈 정

Effective c++ Chapter6
Effective c++ Chapter6Effective c++ Chapter6
Effective c++ Chapter6세빈 정
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2세빈 정
 
디자인 패턴(Observer, visitor)
디자인 패턴(Observer, visitor)디자인 패턴(Observer, visitor)
디자인 패턴(Observer, visitor)세빈 정
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약세빈 정
 
포스트모템1
포스트모템1포스트모템1
포스트모템1세빈 정
 

More from 세빈 정 (6)

Effective c++ Chapter6
Effective c++ Chapter6Effective c++ Chapter6
Effective c++ Chapter6
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
 
디자인 패턴(Observer, visitor)
디자인 패턴(Observer, visitor)디자인 패턴(Observer, visitor)
디자인 패턴(Observer, visitor)
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약
 
Pac-man
Pac-manPac-man
Pac-man
 
포스트모템1
포스트모템1포스트모템1
포스트모템1
 

Gpg study3.7

  • 1. Game Programming Gems 3.7 플로킹: 집단 행동을 나타내는 간단한 기법
  • 2. Idea#1: 플로킹 기법의 규칙 • 분리: 주변 보이드들과 충돌하지 않도록 방향을 돌림 • 정렬: 주변 보이드들과 같은 방향을 가리키도록 함 • 응집: 주변 보이드들과의 평균 위치쪽으로 방향을 돌림 • 회피: 보이드가 장애물(천적)과 부딪히지 않도록 함 *회피 규칙은 위 3가지 규칙(분리, 정렬, 응집)이 활성화될 때에만 적용
  • 3. Idea#2: 플로킹은 상태없는 알고리즘 • 각각의 보이드가 어떠한 상태 정보도 가지지 않음  매 순간마다 자신의 주변을 다시 평가할 뿐, 무리에 대한 정 보는 가지지 않음  따라서 다른 무리 행동 알고리즘에 비해 메모리 요구량이 상당히 적음
  • 4. Idea#3: 게임에서의 응용 • 3D 환경 안에서의 유닛 진형 유지 • 동물들의 무리를 움직일 때 훨씬 더 현실감 있음 • 검사 무리들이 다리를 건너거나 장애물을 피해가게 할 수 있음 • 몬스터가 혼자 도망가다가 무리를 만나면 공격해오게 하는 알 고리즘에 적용 가능
  • 6. Idea#1: 벡터와 이동 • 국소 공간(local scape – 보이드 자신을 중심으로 하는 공간)
  • 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 객체를 생성) • 실제 게임에선 보이드의 가시 범위를 제한 가능 • 개별 보이드가 수명을 가져 죽게 하는것도 가능 • 한 종류의 무리가 다른 종류의 무리를 먹게 하면 천적도 구현 가능