F.R.I.D.A.Y.

사각형의 충돌 판정 본문

DEV/C C++

사각형의 충돌 판정

F.R.I.D.A.Y. 2021. 5. 7. 19:31
반응형

 

게임이란 현대 기술의 정점을 모두 포함하고 있는 기술의 정수다

 

 문득 이런 구절이 떠오르는 포스트가 아닐까 생각합니다. 누가 말했는지는 몰라도 정말 한번에 와 닿는 말이 아닐 수 없습니다. RPG에서만 보더라도 다양한 물리 법칙이 적용된 엔진[# 유니티와 언리얼이 대표적이죠]이 사용되고, FPS 게임에서는 심지어 탄도학도 이용[# 단순히 배틀그라운드 탄도학만 검색해도 나오는 글이 수 십 개...]합니다.

 

 게임에서 중요한 것 중 하나가 막혀 있는 곳을 가지 못하는 것이라 생각합니다. 생각해보세요. 현실에서 물건을 짚으려 손을 뻗었는데 짚이기는 커녕 그 물건을 통과해버린다면. 아마도 기절하지 않을까요?

 

 그래서 게임에서는 물리 엔진을 사용합니다. 사실 게임에만 사용한다기보단, 여러 산업 전반에서 사용하고 있죠. 건축할 때 어떻게 지어야 하중을 견딜 수 있는지 무너지지는 않는지 시뮬레이션을 하고, 영화 인터스텔라에서도 물리엔진을 적용해 생생한 블랙홀 영상을 만들어냈죠.

 

 이번 포스트에서는 충돌 판정, 그 중에서도 사각형의 충돌 판정을 이야기합니다.


충돌 판정

 충돌 판정을 일반적으로 수학 연산을 이용하곤 합니다. 원의 충돌은 두 원의 반지름의 합을 기준으로 충돌을 처리하죠. 그러나 사각형의 충돌 판정은 어려운 수학식이 필요하지 않습니다.

 

 아래처럼 두 개의 사각형이 존재합니다.

 이 두 사각형은 아직 만나지 않았습니다. 벽이 맡닿았을 때 충돌한다고 볼 수 있습니다. 따라서, 아래와같이 구성하게 되면 충돌을 판정할 수 있습니다.

D2D1_RECT_F r1, r2;
//Direct2D를 이용하지 않는경우
//RECT r1, r2;

if(r1.left < r2.right && r1.right > r2.left && r1.top < r2.bottom && r1.bottom > r2.top){
	MessageBox(nullptr, L"Detect", L"", 0);
}

 

시연

 아래 영상은 실제 위 충돌 판정을 검증한 모습입니다.

 

 

심화

 

물리엔진 - 벽 충돌

 이전 시간의 중력 구현에 이어 이번에는 지나갈 수 없는 벽을 구현해봅니다. 벽  물리엔진을 구성하다보니 주로 게임에 빗대는 경우가 많은데, 벽이라 함은 물체가 뚫고 지나갈 수 없는 것을

pang2h.tistory.com

 

# index

728x90
반응형
Comments