본문 바로가기

Programming/물리엔진/게임엔진

간단한 충돌체크 및 간단한 수학

요즘 드래곤플라이트를 가끔씩 하고 있는데 이렇게 정밀한 물리 효과를 요구하지 않는 많은 게임들에서는 간단한 도형의 충돌여부 판별만이 필요하다.

몬스터와 케릭터의 충돌, 미사일과 케릭터의 충돌 등에 각각의 물체의 겉을 바운딩 볼륨으로 감싸서 이 도형들의 충돌 여부를 확인 하는 것이다.

 

이렇게 간단한 곳에 쓸 수 있도록 필요한 간단한 수학 공식(행렬, 벡터)과 원-원, 원-사각형, 사각형-사각형, 점-원, 점-사각형/ 구-구, 구-박스, 박스-박스, 점-구, 점-박스 의 충돌 여부를 판별 할 수 있는 라이브러리를 만들어 보았다.

 

사용법은 Simple_CollisionCheck.h를 include 하고 Simple_CollisionChekc.lib를 링크 한 뒤

 

2D에서는

Bool CircleCircle_CollisionCheck(Circle c1, Circle c2);

Bool CircleSquare_CollisionCheck(Circle c, Square s);

Bool SquareSquare_CollisionCheck(Square s1, Square s2);

Bool PointCircle_CollisionChekck(Vector2 p, Circle c);

Bool PointSquare_CollisionCheck(Vector2 p, Square s); 

 

3D에서는

Bool SphereSphere_CollisionCheck(Sphere s1, Sphere s2);

Bool SphereBox_CollisionCheck(Sphere s, Box b);

Bool BoxBox_CollisionCheck(Box b1, Box b2);

Bool PointSphere_CollisionChekck(Vector3 p, Sphere s);

Bool PointBox_CollisionCheck(Vector3 p, Box b);

 

함수로 충돌 여부를 판별 할 수 있다.

 

Simple_CollisionCheck.h 파일에 필요한 도형 구조체 및 행렬, 벡터의 간단한 함수가 있으므로  게임을 제작할 때 기초부분에서 시간소비를 덜 수 있다.

 

각종 도형은 꼭 좌표축에 평행 하지 않아도 되므로(OBB처럼) 도형의 회전 행렬을 정확히 입력 하기만 하면 된다.

(주의 할 점은 구와 원 구조체의 radius값은 반지름을 의미하지만 사각형과 박스 구조체의 length, depth, height값은 각 길이, 깊이, 높이 의 값이다. 반값이 아니다.)

 

첨부파일은 lib및 헤더파일/ 예제의 실행 파일/ 예제의 소스파일이 있다.


 

 

예제는 방향키로 도형 하나를 움직여서 충돌했으면 도형이 빨간색으로 변하며, 숫자키1~5로 각 충돌체크 함수를 테스트 해 볼 수 있다. 

전에 구현했던 물리엔진에 사용 된 것들을 가져와서 수정한 것이므로 웬만하면 오류가 없겠으나 혹시 모를 버그가 있을 수도 있다....

캡슐, 삼각형, 실린더 등의 모양으로 충돌 체크를 할 수도 있으나, 정교한 물리 반응이 필요한 것이 아니라면 성능의 낭비이므로 위의 도형들로도 충분하다. 한가지 팁은 꼭 한 물체가 사각형 하나, 혹은 원 하나의 바운딩볼륨을 가져야 하는 법은 없다. 여러개의 사각형, 원 등을 가질 수도 있다. 이런식으로 좀 더 정교한 충돌 체크가 가능 하다.

 

(winapi만을 이용 해서 간단히 구현 했으므로 2D의 테스트만 구현했다.)

Simple_CollisionCheck_LIB.zip


Simple_CollisionCheck_Test-실행파일.zip


Simple_CollisionCheck_Test.zip