※출처: http://m.blog.naver.com/winterwolfs/10165506488
1. 원 - 원 충돌
[조건1] 중점 사이의 거리가 반지름의 합보다 작거나 같으면 충돌
float dist = sqrt(pow(point1.x - point2.x, 2) + pow(point1.y - point2.y, 2)); if (dist <= rad1 + rad2) { collision = true; } else { collision = false; }
2. 사각형 - 사각형 충돌 (origin은 좌상단)
[조건1] 첫번째 사각형의 왼쪽 모서리가 두번째 사각형의 오른쪽 모서리를 넘지 않는다.
[조건2] 첫번째 사각형의 오른쪽 모서리가 두번째 사각형의 왼쪽 모서리를 넘어야 한다.
[조건3] 첫번째 사각형의 위쪽 모서리가 두번째 사각형의 아래쪽 모서리를 넘지 않는다.
[조건4] 첫번째 사각형의 아래쪽 모서리가 두번째 사각형의 위쪽 모서리를 넘어야 한다.
if (rect1.origin.x <= rect2.origin.x + rect2.size.width && rect1.origin.x + rect1.size.width >= rect2.origin.x && rect1.origin.y >= rect2.origin.y - rect2.size.height && rect1.origin.y - rect1.size.height <= rect2.origin.y) { collision = true; } else { collision = false; }
3. 원 - 사각형 충돌
[조건1] 원의 반지름 만큼 사각형을 확장한 후, 원의 중심점이 그 사각형 안에 있다면 충돌
[조건2] 예외적으로 대각선 쪽으로 왔을땐 사각형 꼭지점들이 원 안에 있는지 확인(점-원 충돌)
int centerX; int centerY; int radius; bool collision; if ( (left <= centerX && centerX <= right) || (bottom <= centerY && centerY <= top) ) { left = left - radius; right = right + radius; top = top + radius; down = down - radius; if (left < centerX && centerX < right && bottom < centerY && centerY < top) { collision = true; } } else { 사각형의 좌상단 포인트가 원 안에 있다면 collision=true; 사각형의 좌하단 포인트가 원 안에 있다면 collision=true; 사각형의 우상단 포인트가 원 안에 있다면 collision=true; 사각형의 우하단 포인트가 원 안에 있다면 collision=true; } collsion = false;
'게임 개발 > 게임 이론+수학' 카테고리의 다른 글
[게임수학 | 유니티] 16진수와 비트 연산의 활용 (0) | 2019.09.05 |
---|---|
[게임수학 | 유니티] 벡터의 내적을 이용한 시야각 구현하기 (65) | 2017.05.29 |
[게임수학 | 유니티] 캐릭터 점프 구현하기 (1) | 2017.03.22 |