SlideShare une entreprise Scribd logo
1  sur  16
3D Collision
게임 프로그래밍의 정석
chapter 18
직육면체 충돌 처리
구 충돌 처리
선분과 삼각형 충돌 처리
chapter 22
느리지 않은 충돌 검출
내용
직육면체와 직육면체의 충돌 검출
직육면체를 Cuboid 라는 클래스로 표현하면
class Cuboid {
int mX, mY, mZ; // 직육면체의 중심
int mHalfSizeX, mHalfSizeY, mHalfSizeZ; // 각 축의 크기 / 2
bool isIntersect ( const Cuboid& b)
}
다른 직육면체와의 충돌검출 함수 isIntersect()는 좌표축별로 겹쳐있는지에 대한 여부를 판정
한다.
한 축에서 직육면체의 오른쪽이 다른 직육면체의 왼쪽과 닿았는지, 혹은 그 반대인지에 대한 여
부를
축을 바꿔가며 반복해서 판정.
직육면체 충돌처리
< 2차원이라 생각하면 x축으로 겹쳐있는지를 판단 한 후 y축도 겹쳐있는지를 판단해보는 것 >
충돌에 대한 처리
X축, Y축, Z축을 각각 나눠서 생각해야 한다. (충돌했을 때 그냥 물체를 멈춰버리게 만들 수는
없으므로) 따라서 충돌이 없는 경우, x, y, z, xy, yz, xz 로 일곱 번에 걸쳐서 충돌 체크를 해야
한다.(xyz는 안하나)
* 처리 순서
1. object들의 이동 여부를 판정
2. 다음 frame에서의 위치를 계산
3. 충돌하는 방향으로의 이동은 줄이고, 충돌이 없는 방향으로의 이동만 반영
움직임의 최소 단위에 대한 정의가 필요함.
간단 하지만 경사를 표현하기가 어렵다.
(비탈을 만든다고 하면 계단모양으로 세밀하게 만들어야 한다고 함)
직육면체 충돌처리
x
z
x
z
x
z
< y축 평면 상에서 움직임을 –y축 시점으로 볼 때. 빨간 화살표 만큼이 움직임의 최소 단위라고 생각하자 >
구와 구의 교차 판정
두 구의 중심끼리의 거리가 거리의 반경을 합한 것보다 작으면 충돌.
피타고라스 정리로 간단하게 알 수 있음!!
구 충돌처리
< 머 이런거 >
구와 구의 충돌 응답
구와 구가 만날 때 생기는 접선 방향으로 이동을 비껴가게 한다. 아래 그림에서는 v방향으로 가
던 물체가 벽을 만났을 경우, 수평방향인 a로 이동하는 것을 보여준다.
아래 그림에서 a벡터는 v벡터에서 d벡터를 빼면 구할 수 있다. d벡터는 v * cos ∅ 한 값으로
구할 수 있고 cos ∅의 값은
𝑣∙𝑏
𝑣 |𝑏|
으로 구할 수 있다.
두 면이 교차하는 곳에서 어느 면을 먼저 계산하느냐에 따라 떨리는 현상이 발생할 수도 있다고
함.
구 충돌처리
< 이 작업을 매 프레임 하는 듯 >
𝒃 = 𝒄 𝟎 − 𝒄 𝟏
𝒂 = 𝒗 −
𝒃
𝒃
∙ |𝒗| ∙ cos ∅
지면에 세우기
지형은 원래 폴리곤들의 집합이므로 지형과의 충돌처리에서 지형을 삼각형으로 하는 것은 좋은
선택임.
지형과 충돌처리하는 object의 경우 직육면체, 원기둥 등 보다 선분을 사용하는 것이 가장 적은
부하가 걸림.
캐릭터 발 주변에 있는 한 점을 잡고 그 점의 현재 프레임의 위치와 다음 프레임의 위치를 계산
해서
삼각형과 교차하는지를 판단하면 된다.
선분과 삼각형의 충돌처리
삼각형과 선분 교차 판정 개요
직선 표시법
𝒑 = 𝒂 + 𝑡𝒃 , 점 a와 이동량 b, 파라미터 t로 다음 점 p를 나타내는 것. t에 따라 p가 직선상을
이동
t = [0,1]로 제한하면 a에서 a+b로 가는 선분이 된다.
삼각형 표시법
𝒒 = 𝒄 + 𝑢𝒅 + 𝑣𝒆 , 마찬가지로 점 c와 이동량 d, e 파라미터 u,v로 표현할 수 있다.
q는 세 점 c, c+d, c+e로 생기는 평면을 나타낸다.
이 때, u,v를 [0, 1] 범위로 제한하면 평행사변형이 되고 u+v<1인 조건을 추가하면 삼각형이
된다.
충돌 검출
위 두식을 동시에 만족하는 점이 있다면 충돌임!
𝒂 + 𝑡𝒃 = 𝒄 + 𝑢𝒅 + 𝑣𝒆
축이 세개이므로 x,y,z에 대해서 각각 식이 나오고 따라서 t,u,v를 구할 수 있음
얘네를 크래머의 공식(나누는 쪽이 0이 안나오도록 )을 이용해서 푸는 방법이 있고
다음 장에서 나오는 방법으로 풀 수도 있음
선분과 삼각형의 충돌처리
충돌 검출 방법 (계속)
1. 세 점이 이루는 평면 상에 점 p가 있다고 가정하고 세 점 중 하나인 점c와 점p가 이루는 벡터
가 평면의 normal 벡터와 수직임을 이용해서 점 p를 이루는 직선의 방정식 미지수인 t를 구하
고 이 t가 [0,1]범위인지 판단하므로써 평면과 만나는 지를 판단할 수 있다.
2. 만난다면 그 점과 d,e와의 내적을 이용하여 삼각형의 방정식에서 u,v 로 세 점이 이루는 삼
각형 내에 p가 존재하는지를 판단하므로서 충돌을 검출한다.
선분과 삼각형의 충돌처리
< 빨간 선분이 캐릭터(한 점)의 이동을 나타낸다고 할 때,
실선에서 끝난다고 하면, t가 [0,1] 사이가 아니라는 것
이고, 그렇다는 것은 다음프레임이던 그 다음이던 언젠가
는 만나겠지만 지금은 아니라는 것이다.>
𝒑 = 𝒄 + 𝑢𝒅 + 𝑣𝒆 를
𝒑 − 𝒄 = 𝑢𝒅 + 𝑣𝒆 로 치환하고 (이러면 p-c
가 한 벡터가 될 것이고) 이를 d, e 벡터와
각각 내적하므로서 u,v를 구할 수 있다.
u+v<1이라면 삼각형 안에 있는 것으로 판
단할 수 있다.
이음매 문제
u, v가 0 또는 1이라면 두 삼각형의 접선에서 뚫고 나갈 수 있음. 따라서 그 부분에 대한 처리
를 해서 두번 충돌하더라도 관통되지 않게 만들어야함
비탈에서도 알아서 잘 움직인다는데 이 점은 이해가 잘 안됨.
선분과 삼각형의 충돌처리
전체 검사를 하면 속도가 느리다
화면에 1600개의 원을 그리고 전체에 대한 충돌 검사를 하는 경우
충돌 판정은 128만 회 해야하지만 실제 충돌은 4000번 미만으로 일어난다.
실제 충돌한 것만 판정할 수 있다고 하면 판정에 시간은 320분의 1로 줄어들 것.
이상적으로 줄이지는 못하더라도 충돌할 확률이 높은 것들만 체크하면 좋을 것 같다.
느리지 않은 충돌 검출
0
1
2
3
4
< 다섯 개의 원이 있다고 할 때 전체에 대해 충돌체크를 한다면 4+3+2+1=10회다.
𝟓!
𝟑!𝟐!
과도 같다. >
한 축을 기준으로 정렬해서 판단
한 축 기준으로 원들을 모두 이동시킬 경우 0,1 한 그룹 3,2,4 한 그룹 두 그룹이 생긴다. 1+3
으로 4회의 충돌체크만으로 충분하다.
구역을 나눠서 충돌 체크
가까운 곳에 있는 것들끼리 묶어 왼쪽과 오른쪽 그룹 둘로 나누고 이를 또 상하 두 그룹으로 나
누는 것.
이렇게 되면 0과 1 한번 2는 없고 3,4 한번 해서 2번의 충돌체크만으로 가능하다.
하지만 어떻게 선을 그을지 또 선과 원이 겹칠 경우 어떻게 할지에 대한 고민이 따른다.
느리지 않은 충돌 검출
< 구역을 나누는 방법 >
0
1
2
3
4
0
1
2
3
4
< 정렬하는 방법 >
0 1 3 2 4
한 축을 기준으로 정렬해서 판단
각각의 원의 크기가 다르다면 원의 중심만으로는 체크할 수 없다.(엄청 큰 원이 있다면..)
따라서 원의 좌측 끝 우측 끝 두 포인트를 체크한다.
아래 그림은 원을 좌우 끝과 그 반경으로만 표현한 것이다.
한 원의 충돌을 판정할 때 다음과 같은 로직을 적용할 수 있다.
if (왼쪽이다.) {
판정한다
기억해둔다.
} else if (오른쪽이다.) {
if (만난 적이 있다.) { 기억해둔 것을 잊어버린다.}
else if (처음 만났다.) { 판정한다.}
}
느리지 않은 충돌 검출
< 원 2의 충돌체크인 경우 먼저 [1은 처음이므로 판정 후 리스트에 저장하고 다음 1]을 만나면 리스트에서 제거
한다. 0]은 처음 만났으므로 판정하되 좌측이 아니므로 저장은 하지 않는다. >
[0 0]
[1 1]
[2 2]
[3 3]
한 축을 기준으로 정렬해서 판단
세로 축으로 정렬해 있을 경우 위 방법은 O(N2)이 되는데다 한 원을 두 번씩 나눠 계산하게 되
므로 계산양이 그냥 전체 체크하는 것보다 더 크게 된다. 따라서 이런 경우에는 다른 축을 기준
으로 하는 것도 고려해보아야 하는데 이를 판단하는 기준은 원들의 분산 정도가 될 수 있다.
즉 축 별로 분산을 계산하여 큰 쪽을 고르는 것으로, 분산을 구하는 데는 O(N)정도의 복잡도로
가능하므로 평균적으로 좋은 성능을 낼 수 있을 것이다.
느리지 않은 충돌 검출
구역을 나눠서 충돌 체크 (균등 분할)
xyz 축에 대해서 균일하게 공간을 나눈 뒤, 각 물체가 어느 상자에 들어가는 지 조사하고 상자
별로 전체검사를 하는 방식이다. 문제는 물체가 여러 상자에 걸치는 경우다. (세 물체가 동시에
두 상자에 걸친다고 생각해도 3번의 충돌체크로 끝날 것을 상자 별로 6번 충돌체크 해야 한다.)
상자 내에 물체를 저장할 때 사용할 자료구조에 따라 속도차이가 많이 나는데 std::list를 사용
할 경우 매번 new하는 과정이 있기 때문에 속도가 굉장히 늦다. 배열로 만들어서 넣어두면 정
렬해서 판단하는 방법보다 빨라질 수 있으나 메모리 용량을 계속 고려해주어야 한다는 점이 문
제다.
또한 물체들이 한 곳에 모여있는 경우, 즉 물체가 편중되어 있을 경우 쓸데 없는 상자가 대량으
로 생기고 물체가 모여있는 상자에서는 전체 검사를 해야 하는 경우가 생기기 때문에 최악의 경
우 O(N2)이 된다.
이런 특성 때문에 고정된 물체(지형 등)와의 판정에서 주로 쓴다고 한다.
느리지 않은 충돌 검출
< 물체가 여러 상자에 걸치는 경우> < 물체들이 한 상자에 집중된 경우>
0 1 3
0
1
23
4
구역을 나눠서 충돌 체크 (고도의 공간 분할)
K-d tree : 재귀적으로 동일한 영역 두 개로 나누면서 그 분할선이 xyz축 중 하나와 평행하게
만듦
1. 전체 물체가 들어가는 큰 상자를 만들고 분할 시작
2. 분할 방식을 결정하고 xy중 어느 쪽으로 분할할지 결정
3. 자식 노드를 두 개 만들어 물체를 나눈다.
4. 자식 노드에 대해 2부터 반복
트리를 구축하는데 시간이 걸리므로 분할 횟수를 어느 정도로 한정하면 판정횟수는 늘지만 분
할에 걸리는 시간은 경감 된다.
느리지 않은 충돌 검출

Contenu connexe

Tendances

전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
devCAT Studio, NEXON
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
KyeongWon Koo
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
영준 박
 
05_벡터와 매트릭스
05_벡터와 매트릭스05_벡터와 매트릭스
05_벡터와 매트릭스
noerror
 

Tendances (20)

전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
" 모바일 롤플레잉게임 인터페이스디자인 문서"
 " 모바일 롤플레잉게임 인터페이스디자인 문서" " 모바일 롤플레잉게임 인터페이스디자인 문서"
" 모바일 롤플레잉게임 인터페이스디자인 문서"
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 
Recast Detour.pptx
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptx
 
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
NDC2012_마비노기 영웅전 카이 포스트모템_시선을 사로잡는 캐릭터 카이 그 시도와 성공의 구현 일지
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
게임제작개론 : #4 게임 밸런싱
게임제작개론 : #4 게임 밸런싱게임제작개론 : #4 게임 밸런싱
게임제작개론 : #4 게임 밸런싱
 
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기
 
【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル
【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル
【読書会資料】『StanとRでベイズ統計モデリング』Chapter12:時間や空間を扱うモデル
 
動的計画法
動的計画法動的計画法
動的計画法
 
KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
 
05_벡터와 매트릭스
05_벡터와 매트릭스05_벡터와 매트릭스
05_벡터와 매트릭스
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
 
유니티3D에서 2D 이미지 다루기
유니티3D에서 2D 이미지 다루기유니티3D에서 2D 이미지 다루기
유니티3D에서 2D 이미지 다루기
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
 

Similaire à 입체충돌처리

Gpg1권] 4 5 3 d 충돌 검출
Gpg1권] 4 5 3 d 충돌 검출Gpg1권] 4 5 3 d 충돌 검출
Gpg1권] 4 5 3 d 충돌 검출
Young-jun Jeong
 
이산치수학 Project3
이산치수학 Project3이산치수학 Project3
이산치수학 Project3
KoChungWook
 

Similaire à 입체충돌처리 (20)

KAIST RUN 교내 ACM-ICPC 모의대회 Advanced division 풀이
KAIST RUN 교내 ACM-ICPC 모의대회 Advanced division 풀이KAIST RUN 교내 ACM-ICPC 모의대회 Advanced division 풀이
KAIST RUN 교내 ACM-ICPC 모의대회 Advanced division 풀이
 
Ray-triangle intersection
Ray-triangle intersectionRay-triangle intersection
Ray-triangle intersection
 
선형대수 06. 영벡터공간과 해집합
선형대수 06. 영벡터공간과 해집합선형대수 06. 영벡터공간과 해집합
선형대수 06. 영벡터공간과 해집합
 
Gpg1권] 4 5 3 d 충돌 검출
Gpg1권] 4 5 3 d 충돌 검출Gpg1권] 4 5 3 d 충돌 검출
Gpg1권] 4 5 3 d 충돌 검출
 
프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2
 
[SHAKE] 경인지역 6개연합 프로그래밍 경시대회 - 본선문제
[SHAKE] 경인지역 6개연합 프로그래밍 경시대회 - 본선문제[SHAKE] 경인지역 6개연합 프로그래밍 경시대회 - 본선문제
[SHAKE] 경인지역 6개연합 프로그래밍 경시대회 - 본선문제
 
컴퓨터 그래픽스 2015-2019년 기말시험
컴퓨터 그래픽스 2015-2019년 기말시험컴퓨터 그래픽스 2015-2019년 기말시험
컴퓨터 그래픽스 2015-2019년 기말시험
 
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
 
[컴퓨터비전과 인공지능] 7. 합성곱 신경망 1
[컴퓨터비전과 인공지능] 7. 합성곱 신경망 1[컴퓨터비전과 인공지능] 7. 합성곱 신경망 1
[컴퓨터비전과 인공지능] 7. 합성곱 신경망 1
 
Wasserstein GAN 수학 이해하기 I
Wasserstein GAN 수학 이해하기 IWasserstein GAN 수학 이해하기 I
Wasserstein GAN 수학 이해하기 I
 
벡터
벡터벡터
벡터
 
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이[KAIST - RUN] 프로그래밍 경진대회 문제 풀이
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이
 
06. graph mining
06. graph mining06. graph mining
06. graph mining
 
알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)알고리즘 연합캠프 세미나 3-B (LCA)
알고리즘 연합캠프 세미나 3-B (LCA)
 
이산치수학 Project3
이산치수학 Project3이산치수학 Project3
이산치수학 Project3
 
선형대수 12강 Gram-Schmidt Orthogonalization
선형대수 12강 Gram-Schmidt Orthogonalization선형대수 12강 Gram-Schmidt Orthogonalization
선형대수 12강 Gram-Schmidt Orthogonalization
 
Picking
PickingPicking
Picking
 
유니티 고급 과정 -2-
유니티 고급 과정 -2-유니티 고급 과정 -2-
유니티 고급 과정 -2-
 
Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)
 
Chapter 16 structured probabilistic models for deep learning - 1
Chapter 16 structured probabilistic models for deep learning - 1Chapter 16 structured probabilistic models for deep learning - 1
Chapter 16 structured probabilistic models for deep learning - 1
 

Plus de quxn6 (13)

모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 
C++11 Tuple
C++11 TupleC++11 Tuple
C++11 Tuple
 
이펙티브 C++ 789 공부
이펙티브 C++ 789 공부이펙티브 C++ 789 공부
이펙티브 C++ 789 공부
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디
 
비실사렌더링-툰 쉐이딩
비실사렌더링-툰 쉐이딩비실사렌더링-툰 쉐이딩
비실사렌더링-툰 쉐이딩
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
중급 소켓프로그래밍
중급 소켓프로그래밍중급 소켓프로그래밍
중급 소켓프로그래밍
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디
 
introduce unity3D and playmaker basic
introduce unity3D and playmaker basicintroduce unity3D and playmaker basic
introduce unity3D and playmaker basic
 
TCP echo 서버 및 클라이언트 예제 스터디
TCP echo 서버 및 클라이언트 예제 스터디TCP echo 서버 및 클라이언트 예제 스터디
TCP echo 서버 및 클라이언트 예제 스터디
 

입체충돌처리

  • 2. 게임 프로그래밍의 정석 chapter 18 직육면체 충돌 처리 구 충돌 처리 선분과 삼각형 충돌 처리 chapter 22 느리지 않은 충돌 검출 내용
  • 3. 직육면체와 직육면체의 충돌 검출 직육면체를 Cuboid 라는 클래스로 표현하면 class Cuboid { int mX, mY, mZ; // 직육면체의 중심 int mHalfSizeX, mHalfSizeY, mHalfSizeZ; // 각 축의 크기 / 2 bool isIntersect ( const Cuboid& b) } 다른 직육면체와의 충돌검출 함수 isIntersect()는 좌표축별로 겹쳐있는지에 대한 여부를 판정 한다. 한 축에서 직육면체의 오른쪽이 다른 직육면체의 왼쪽과 닿았는지, 혹은 그 반대인지에 대한 여 부를 축을 바꿔가며 반복해서 판정. 직육면체 충돌처리 < 2차원이라 생각하면 x축으로 겹쳐있는지를 판단 한 후 y축도 겹쳐있는지를 판단해보는 것 >
  • 4. 충돌에 대한 처리 X축, Y축, Z축을 각각 나눠서 생각해야 한다. (충돌했을 때 그냥 물체를 멈춰버리게 만들 수는 없으므로) 따라서 충돌이 없는 경우, x, y, z, xy, yz, xz 로 일곱 번에 걸쳐서 충돌 체크를 해야 한다.(xyz는 안하나) * 처리 순서 1. object들의 이동 여부를 판정 2. 다음 frame에서의 위치를 계산 3. 충돌하는 방향으로의 이동은 줄이고, 충돌이 없는 방향으로의 이동만 반영 움직임의 최소 단위에 대한 정의가 필요함. 간단 하지만 경사를 표현하기가 어렵다. (비탈을 만든다고 하면 계단모양으로 세밀하게 만들어야 한다고 함) 직육면체 충돌처리 x z x z x z < y축 평면 상에서 움직임을 –y축 시점으로 볼 때. 빨간 화살표 만큼이 움직임의 최소 단위라고 생각하자 >
  • 5. 구와 구의 교차 판정 두 구의 중심끼리의 거리가 거리의 반경을 합한 것보다 작으면 충돌. 피타고라스 정리로 간단하게 알 수 있음!! 구 충돌처리 < 머 이런거 >
  • 6. 구와 구의 충돌 응답 구와 구가 만날 때 생기는 접선 방향으로 이동을 비껴가게 한다. 아래 그림에서는 v방향으로 가 던 물체가 벽을 만났을 경우, 수평방향인 a로 이동하는 것을 보여준다. 아래 그림에서 a벡터는 v벡터에서 d벡터를 빼면 구할 수 있다. d벡터는 v * cos ∅ 한 값으로 구할 수 있고 cos ∅의 값은 𝑣∙𝑏 𝑣 |𝑏| 으로 구할 수 있다. 두 면이 교차하는 곳에서 어느 면을 먼저 계산하느냐에 따라 떨리는 현상이 발생할 수도 있다고 함. 구 충돌처리 < 이 작업을 매 프레임 하는 듯 > 𝒃 = 𝒄 𝟎 − 𝒄 𝟏 𝒂 = 𝒗 − 𝒃 𝒃 ∙ |𝒗| ∙ cos ∅
  • 7. 지면에 세우기 지형은 원래 폴리곤들의 집합이므로 지형과의 충돌처리에서 지형을 삼각형으로 하는 것은 좋은 선택임. 지형과 충돌처리하는 object의 경우 직육면체, 원기둥 등 보다 선분을 사용하는 것이 가장 적은 부하가 걸림. 캐릭터 발 주변에 있는 한 점을 잡고 그 점의 현재 프레임의 위치와 다음 프레임의 위치를 계산 해서 삼각형과 교차하는지를 판단하면 된다. 선분과 삼각형의 충돌처리
  • 8. 삼각형과 선분 교차 판정 개요 직선 표시법 𝒑 = 𝒂 + 𝑡𝒃 , 점 a와 이동량 b, 파라미터 t로 다음 점 p를 나타내는 것. t에 따라 p가 직선상을 이동 t = [0,1]로 제한하면 a에서 a+b로 가는 선분이 된다. 삼각형 표시법 𝒒 = 𝒄 + 𝑢𝒅 + 𝑣𝒆 , 마찬가지로 점 c와 이동량 d, e 파라미터 u,v로 표현할 수 있다. q는 세 점 c, c+d, c+e로 생기는 평면을 나타낸다. 이 때, u,v를 [0, 1] 범위로 제한하면 평행사변형이 되고 u+v<1인 조건을 추가하면 삼각형이 된다. 충돌 검출 위 두식을 동시에 만족하는 점이 있다면 충돌임! 𝒂 + 𝑡𝒃 = 𝒄 + 𝑢𝒅 + 𝑣𝒆 축이 세개이므로 x,y,z에 대해서 각각 식이 나오고 따라서 t,u,v를 구할 수 있음 얘네를 크래머의 공식(나누는 쪽이 0이 안나오도록 )을 이용해서 푸는 방법이 있고 다음 장에서 나오는 방법으로 풀 수도 있음 선분과 삼각형의 충돌처리
  • 9. 충돌 검출 방법 (계속) 1. 세 점이 이루는 평면 상에 점 p가 있다고 가정하고 세 점 중 하나인 점c와 점p가 이루는 벡터 가 평면의 normal 벡터와 수직임을 이용해서 점 p를 이루는 직선의 방정식 미지수인 t를 구하 고 이 t가 [0,1]범위인지 판단하므로써 평면과 만나는 지를 판단할 수 있다. 2. 만난다면 그 점과 d,e와의 내적을 이용하여 삼각형의 방정식에서 u,v 로 세 점이 이루는 삼 각형 내에 p가 존재하는지를 판단하므로서 충돌을 검출한다. 선분과 삼각형의 충돌처리 < 빨간 선분이 캐릭터(한 점)의 이동을 나타낸다고 할 때, 실선에서 끝난다고 하면, t가 [0,1] 사이가 아니라는 것 이고, 그렇다는 것은 다음프레임이던 그 다음이던 언젠가 는 만나겠지만 지금은 아니라는 것이다.> 𝒑 = 𝒄 + 𝑢𝒅 + 𝑣𝒆 를 𝒑 − 𝒄 = 𝑢𝒅 + 𝑣𝒆 로 치환하고 (이러면 p-c 가 한 벡터가 될 것이고) 이를 d, e 벡터와 각각 내적하므로서 u,v를 구할 수 있다. u+v<1이라면 삼각형 안에 있는 것으로 판 단할 수 있다.
  • 10. 이음매 문제 u, v가 0 또는 1이라면 두 삼각형의 접선에서 뚫고 나갈 수 있음. 따라서 그 부분에 대한 처리 를 해서 두번 충돌하더라도 관통되지 않게 만들어야함 비탈에서도 알아서 잘 움직인다는데 이 점은 이해가 잘 안됨. 선분과 삼각형의 충돌처리
  • 11. 전체 검사를 하면 속도가 느리다 화면에 1600개의 원을 그리고 전체에 대한 충돌 검사를 하는 경우 충돌 판정은 128만 회 해야하지만 실제 충돌은 4000번 미만으로 일어난다. 실제 충돌한 것만 판정할 수 있다고 하면 판정에 시간은 320분의 1로 줄어들 것. 이상적으로 줄이지는 못하더라도 충돌할 확률이 높은 것들만 체크하면 좋을 것 같다. 느리지 않은 충돌 검출 0 1 2 3 4 < 다섯 개의 원이 있다고 할 때 전체에 대해 충돌체크를 한다면 4+3+2+1=10회다. 𝟓! 𝟑!𝟐! 과도 같다. >
  • 12. 한 축을 기준으로 정렬해서 판단 한 축 기준으로 원들을 모두 이동시킬 경우 0,1 한 그룹 3,2,4 한 그룹 두 그룹이 생긴다. 1+3 으로 4회의 충돌체크만으로 충분하다. 구역을 나눠서 충돌 체크 가까운 곳에 있는 것들끼리 묶어 왼쪽과 오른쪽 그룹 둘로 나누고 이를 또 상하 두 그룹으로 나 누는 것. 이렇게 되면 0과 1 한번 2는 없고 3,4 한번 해서 2번의 충돌체크만으로 가능하다. 하지만 어떻게 선을 그을지 또 선과 원이 겹칠 경우 어떻게 할지에 대한 고민이 따른다. 느리지 않은 충돌 검출 < 구역을 나누는 방법 > 0 1 2 3 4 0 1 2 3 4 < 정렬하는 방법 > 0 1 3 2 4
  • 13. 한 축을 기준으로 정렬해서 판단 각각의 원의 크기가 다르다면 원의 중심만으로는 체크할 수 없다.(엄청 큰 원이 있다면..) 따라서 원의 좌측 끝 우측 끝 두 포인트를 체크한다. 아래 그림은 원을 좌우 끝과 그 반경으로만 표현한 것이다. 한 원의 충돌을 판정할 때 다음과 같은 로직을 적용할 수 있다. if (왼쪽이다.) { 판정한다 기억해둔다. } else if (오른쪽이다.) { if (만난 적이 있다.) { 기억해둔 것을 잊어버린다.} else if (처음 만났다.) { 판정한다.} } 느리지 않은 충돌 검출 < 원 2의 충돌체크인 경우 먼저 [1은 처음이므로 판정 후 리스트에 저장하고 다음 1]을 만나면 리스트에서 제거 한다. 0]은 처음 만났으므로 판정하되 좌측이 아니므로 저장은 하지 않는다. > [0 0] [1 1] [2 2] [3 3]
  • 14. 한 축을 기준으로 정렬해서 판단 세로 축으로 정렬해 있을 경우 위 방법은 O(N2)이 되는데다 한 원을 두 번씩 나눠 계산하게 되 므로 계산양이 그냥 전체 체크하는 것보다 더 크게 된다. 따라서 이런 경우에는 다른 축을 기준 으로 하는 것도 고려해보아야 하는데 이를 판단하는 기준은 원들의 분산 정도가 될 수 있다. 즉 축 별로 분산을 계산하여 큰 쪽을 고르는 것으로, 분산을 구하는 데는 O(N)정도의 복잡도로 가능하므로 평균적으로 좋은 성능을 낼 수 있을 것이다. 느리지 않은 충돌 검출
  • 15. 구역을 나눠서 충돌 체크 (균등 분할) xyz 축에 대해서 균일하게 공간을 나눈 뒤, 각 물체가 어느 상자에 들어가는 지 조사하고 상자 별로 전체검사를 하는 방식이다. 문제는 물체가 여러 상자에 걸치는 경우다. (세 물체가 동시에 두 상자에 걸친다고 생각해도 3번의 충돌체크로 끝날 것을 상자 별로 6번 충돌체크 해야 한다.) 상자 내에 물체를 저장할 때 사용할 자료구조에 따라 속도차이가 많이 나는데 std::list를 사용 할 경우 매번 new하는 과정이 있기 때문에 속도가 굉장히 늦다. 배열로 만들어서 넣어두면 정 렬해서 판단하는 방법보다 빨라질 수 있으나 메모리 용량을 계속 고려해주어야 한다는 점이 문 제다. 또한 물체들이 한 곳에 모여있는 경우, 즉 물체가 편중되어 있을 경우 쓸데 없는 상자가 대량으 로 생기고 물체가 모여있는 상자에서는 전체 검사를 해야 하는 경우가 생기기 때문에 최악의 경 우 O(N2)이 된다. 이런 특성 때문에 고정된 물체(지형 등)와의 판정에서 주로 쓴다고 한다. 느리지 않은 충돌 검출 < 물체가 여러 상자에 걸치는 경우> < 물체들이 한 상자에 집중된 경우> 0 1 3 0 1 23 4
  • 16. 구역을 나눠서 충돌 체크 (고도의 공간 분할) K-d tree : 재귀적으로 동일한 영역 두 개로 나누면서 그 분할선이 xyz축 중 하나와 평행하게 만듦 1. 전체 물체가 들어가는 큰 상자를 만들고 분할 시작 2. 분할 방식을 결정하고 xy중 어느 쪽으로 분할할지 결정 3. 자식 노드를 두 개 만들어 물체를 나눈다. 4. 자식 노드에 대해 2부터 반복 트리를 구축하는데 시간이 걸리므로 분할 횟수를 어느 정도로 한정하면 판정횟수는 늘지만 분 할에 걸리는 시간은 경감 된다. 느리지 않은 충돌 검출