-
[Unity] AABB수학&물리/게임 수학 2020. 5. 19. 02:34
1. Sphere
두 개의 원이 충돌 체크를 하는 방법은 간단하다.
먼저 각각의 원에 대한 반지름을 확인하고,
각각의 원의 반지름을 더한 값과 두 원 사이의 거리를 비교하여 판단하면 된다.
충돌이 일어나지 않은 상황이라면 두 원 사이의 거리는 두 원의 반지름을 더한 값보다 클 것이고
충돌이 일어났다면 두 원 사이의 거리는 두 원의 반지름보다 값이 작을 것이다.
이 상황에서 y는 0이라 가정할 것이다.
벡터를 활용하여 두 원의 거리를 구하는 방식이다.
각각의 X, Z 값을 받아서 뺄셈을 통해 새로운 벡터를 만들어내면 이 벡터는 원에서 다른 원 까지의 벡터를 나타낸다.
그 후 벡터의 길이를 알아내는 공식을 통해 원하는 값을 얻어낼 수 있다.
√(x^2 + z^2)
길이를 서로 비교하며 판단하기 위한 함수이다.
부딪히지 않은 상태이므로 Not Crush를 출력하는 모습이다.
부딪혀서 Crush! 를 출력하는 모습이다.
2. Box
AABB의 약자는 Axis Aligned Bounding Box이다.
두 직육면체의 충돌을 판단하는 방법은 해당 물체의 X, Y, Z 축의 최대값과 최소값을 알아야한다.
각 축에 대한 경우의 수를 판단하여 정의된 범위가 AABB이다.
경우의 수는 각 축의 최대값과 최소값으로 2가지임으로 모두 더하여 총 6가지이다.
(MinX, MaxX + MinY, MaxY + MinZ, MaxZ)
각 축 방향에서 직육면체의 변에 충돌하는 지를 검사하면 된다.
X, Y, Z 모든 축에서 검사를 통해 모든 축에 충돌 했다면 충돌로 판단하게 하면 된다.
보통은 움직이지 않는 물체에 대하여 사용하지만 본인은 이론은 지키면서 다르게 구현해봤다.
대상 오브젝트의 각 축에 대한 최소 값과 최대 값을 구하고
대상의 최소 값보다 우리의 최대 값이 커지거나 혹은 대상의 최대 값 보다 우리의 최소 값이 작다면 충돌이도록 한다.
각 축 기준으로 체크한 구문과 그것을 모두 합하여 모든 충돌이 일어났을 때 두 가지를 구현하였다.
그 결과로 정상적인 작동이 잘 되고 있음을 나타낸다.