본문 바로가기
Game Programming

충돌체크의 간단한 수학적 풀이

by 게임혼 2007. 11. 2.

충돌 체크는 대부분이 사각형을 이용한 체크를 한다. 마스크를 이용한다던지..

일일히 대조하는 것이 아닌 영역을 지정하여 해당 영역의 교집합을 구하는 것으로 충돌을 체크하는 것이다. 이것을 수학적으로 풀이하면 여러가지 방법이 있겠지만 내가 즐겨 사용하는 것으로는

abs 즉 절대값을 이용한 계산이 있다.

 

a라는 박스가 x=10 y=10 가로 w = 10 세로 h = 10 이고

b라는 박스가 x=10 y=15 가로 w = 10 세로 h = 10 이다

일단 생각하기에 이 박스는 겹치기는 겹치는 것 같다. 그런데 확실히

공식을 통해 겹치는지 알아보자.

 

일단 a와 b 모두 중점을 구하도록 하자.

a.cx = a.x-a.w/2,  a.cy = a.y-a.h/2  cx는 x의 중점이고 cy는 y의 중점이다.

b도 같은 방식으로 구하자. 그러면 둘다 흔히 말하는 노말라이즈가 된거다. ㅋㅋㅋ

 

그럼 이제 하나를 기준점으로 잡고 뺄셈을 하자. (어차피 2D평면에서의 절대 좌표는 모두 +값이기 때문에 뺄셈으로 가능하다.)

 

abs(a.cx - b.cx) < a.w/2+b.w/2 이라면 a와 b는 x축으로는 겹쳐있는 상태라고 볼 수 있다. 현재 값은 0이다. a와 b는 평행하다. 그럼 y축은 어떨까?

abs(a.cy - b.cy) < a.h/2+b.h/2 좌측 조건이 참인가? 값으로는 5가 나왔다. 이 값은 a.h/2+b.h/2보다 작다. 그러므로 a와 b는 x축으로 평행하며 y축으로 5의 값으로 접해있다고 할 수 있다.

 

사용자 삽입 이미지

상기 그림처럼 되어 있다는 것이다.

이렇게해서 수학적으로 충돌박스의 체크를 설명해 보았다.

물론 다른 방법도 있다. 그러나 이게 젤 편하다. 본인의 입장으로서는..

여기서 몇가지 방법을 더 하면 백터로 했을 때 내적과 외적등등 응용이 가능하다.

접한 방향이라던지 말이다.

 

www.gamehon.comwww.gamemotor.com

 

 

'Game Programming' 카테고리의 다른 글

황금열쇠의 원형  (0) 2007.11.21
서버 프로토콜은 어떻게 해야 하는가?  (0) 2007.11.04
ARM 계열에서의 1바이트 팩킹?  (0) 2007.10.22
플로트랜드 모바일  (0) 2007.09.29
DEVC++ DX사용  (0) 2007.09.20