3D 충돌체크 모든 유형별 정리
3D 공간에서의 충돌 체크 유형과 개념 정리.
물체끼리의 충돌 유형들
Point in Sphere
Point in AABB
Point in OBB
Point on Plane
Closest Point on Plane
Point on Line segment
Point on Ray
Closest Point on Ray
Sphere to Sphere
Sphere to AABB
Sphere to OBB
Sphere to Plane
AABB to AABB
AABB to OBB
AABB to Plane
OBB to OBB
OBB to Plane
Plane to Plane
Point in Sphere
P와 S의 중점 C간의 거리 D와 반지름 R길이 비교로 체크.
이 때, 연산 효율을 위해 반지름의 제곱과 비교해줄 수 있음. (D에서 루트(square root)를 씌우지 않은 값과 비교)
이 때 거리 D의 제곱은 Dot(D, D) 값과 동일하다. (cos 0 값은 1 이므로.)
+ Closest Point on sphere
= C + (D.normalize() * R)
Point in AABB
AABB의 min/max 값을 준으로 범위를 벗어났는지 체크.
Point in OBB
두 가지 방향이 존재.
1. OBB 박스의 회전 축을 좌표계로 하는 공간으로 변환한 뒤 AABB와 동일하게 체크하는 방법.
2. P와 OBB의 중점 C까지의 벡터 D를, OBB의 회전축으로 투영시켜 얻은 벡터 D' 의 길이를 구해서 OBB의 Size와 체크.
D를 OBB의 회적축으로 투영시키는 것은 D와 단위벡터간의 내적 연산이고 그 결과는 투영된 D'벡터의 길이가 됨.
즉, result = axis_x.Dot(D);
Point on Plane
Plane 은 몇 가지 정의가 있을 수 있다.
1. 3개의 정점
2. 1개의 정점과 노멀벡터
3. 원점으로부터의 거리와 노멀벡터
원점에서 점P까지의 벡터D 를 평면의 노멀벡터에 투영, 즉 내적 연산을 하면 원점에서 평면까지의 거리와 동일해진다. 이를 비교 체크.
ClosestPoint on Plane
Point on Plane 과 원리는 동일.
원점에서 점P까지의 벡터D 를 평면의 노멀벡터에 투영시킨 PD벡터의 길이에서, 원점에서 평면까지의 거리를 빼면, 평면에서 P까지의 최단거리를 구할 수 있다.
P에서 평면의 노말에 최단거리를 곱한 만큼 이동하면, 평면 위의 가장 가까운 점을 구할 수 있음.
(이 때, 최단거리가 양수면 점이 평면의 앞쪽에, 음수면 점이 평면의 뒤쪽에 있는 것.(점이 평면보다 원점에 더 가까운 것)
Point on Line segment
전략은, 선분이 직선이라 가정하고, 점과 가장 가까운 직선 위의 점을 찾아서 선분 범위 내에 있는지를 체크.
선분의 시작/끝점으로 벡터(끝이 없는) V를 만들고, 선분의 시작점과 타겟 점을 이은 벡터를 D라고 할 때, D를 V로 투영, 즉 내적. 이 때 V는 노멀라이즈 되지 않았기 때문에 결과값은 |V|*|D| 가 됨. 여기서 V.dot(V) 를 나눠주면 |V|*|D| / |V|*|V| 가 됨. 분모와 분자에서 |V|를 상쇄시켜주면 |D|/|V| 라는 V길이에 대한 D길이의 비율 r을 구할 수 있음. r이 0<=r, r <=1 범위로 오도록 해서 선분의 시작점에서 V * r 을 더하면, 대상 점과 선분 위의 가장 가까운 점을 구할 수 있다.
마지막으로, 해당 점과, 선분 위 가장 가까운 점 사이의 거리를 구해서, 그 거리가 0이면 선분 위에 있는 점이라고 할 수 있음.
Point on Ray
특정 점P가 Ray 위에 있는지 체크하려면,
Ray의 시작점 O에서 P로의 벡터 D를 노멀라이즈 한 Dn을 Ray의 노멀벡터인 N으로 내적연산한 값이 1인지 체크하면 된다. cos 0 값이 1이기 때문에, 두 단위벡터를 내적했을 때 값이 1이면 두 단위 벡턴는 동일하다 볼 수 있다.
ClosestPoint on Ray
위에서 구한 벡터 D를 N으로 내적시켜 길이 t를 구하고, O에서 N 방향으로 t만큼 이동하면 구할 수 있음.
Sphere to Sphere
S1중점과 S2중점 사이의 거리 D가 S1반지름 + S2반지름보다 작으면 교차 충돌.
마찬가지로 연산 최적화를 위해 R제곱 값과 비교
Sphere to AABB
AABB 박스에서 구까지의 Closest Point(가장 가까운 점) C를 구한 뒤,
구의 원점 S와 C까지의 거리 D와 구의 반지름 R의 길이를 비교.
마찬가지로 연산 최적화를 위해, D는 거리의 제곱까지만 구하고, R제곱 값과 비교
여기서 AABB와의 Closest Point 는 min, max 점들과 각각 최대값, 최소값을 구하면 됨.
Sphere to OBB
Sphere 의 중점 C와 OBB에서 가장 가까운 점(Closest Point) P를 구하고, C와 P사이의 거리와 Sphere의 반지름 길이와 비교. 반지름이 더 크다면 교차.
Sphere to Plane
마찬가지로 Sphere의 중점에서 Plane 위의 가장 가까운 점을 구한다. ClosestPoint on Plane 참조.
AABB to AABB
두 AABB 박스의 min, max 를 각각 구한 뒤, 모든 좌표축에서 겹치는지 and 연산으로 체크.
AABB to OBB
SAT (Separating Axis Teorem) 방식으로 체크.
SAT 분리 이론은 본문 하단의 링크 참조해서 체크.
짧은 개념은, 모든 축(Axis)에 대해서 분리축을 찾아내는 것. (AABB, OBB각 면들의 법선 벡터와 AABB,OBB 법선을 서로 외적한 축 9개)
각 축에 대해 모든 정점들을 내적해서 최소/최대 값, 즉 간격(interval)을 구한 뒤 다른 물체의 같은 축에 대한 interval 과 겹치는지 체크.
AABB to Plane
Plane위에 임의의 점 하나와 Plane노멀 방향 벡터를 구하고 AABB의 8개 점들 모두를 내적해서 부호가 다른 점이 하나라도 있다면 평면 뒤에 있다는 것.
OBB to OBB
AABB to OBB 와 유사.
OBB to Plane
AABB to Plane 과 유사.
Plane to Plane
두 평면이 평행이 아닌지를 체크하면 된다. 두 평면의 노멀벡터를 N1, N2 라고 할 때, N1 X N2 외적 결과가 0이면 평행.
SAT 이론 참조 링크
https://sanghoon23.tistory.com/82
게임 개발에 필수적인 내용을 담는 명서들을 소개합니다.
<유니티 교과서 개정6판>(유니티 최신 버전) 구입 링크
https://link.coupang.com/a/be3P0t
<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas
<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd
유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h
(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)