요즘 드래곤플라이트를 가끔씩 하고 있는데 이렇게 정밀한 물리 효과를 요구하지 않는 많은 게임들에서는 간단한 도형의 충돌여부 판별만이 필요하다.
몬스터와 케릭터의 충돌, 미사일과 케릭터의 충돌 등에 각각의 물체의 겉을 바운딩 볼륨으로 감싸서 이 도형들의 충돌 여부를 확인 하는 것이다.
이렇게 간단한 곳에 쓸 수 있도록 필요한 간단한 수학 공식(행렬, 벡터)과 원-원, 원-사각형, 사각형-사각형, 점-원, 점-사각형/ 구-구, 구-박스, 박스-박스, 점-구, 점-박스 의 충돌 여부를 판별 할 수 있는 라이브러리를 만들어 보았다.
사용법은 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_Test-실행파일.zip
Simple_CollisionCheck_Test.zip
'Programming > 물리엔진/게임엔진' 카테고리의 다른 글
구와 박스(OBB 또는 AABB)의 충돌체크 (0) | 2013.01.29 |
---|---|
물리엔진 구현에 필요한 요소들 및 구현 팁(생각나는대로 추가 중) (0) | 2013.01.29 |
전에 구현한 3D물리엔진을 2D엔진으로 변형... (0) | 2013.01.29 |
LCP 문제로 구현 한 물리 엔진 (0) | 2013.01.29 |
혼자서 구현 해 본 물리엔진 - DirectX로 렌더링 함 (0) | 2013.01.29 |