게임 개발 자료

3D 충돌체크 모든 유형별 정리

원소랑 2024. 1. 26. 18:59

 

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

 

[DX] ##6. AABB, OBB 충돌 SAT 분리축 이론( Separating Axis Theorem )

Frustum Culling ( 절두체 선별 ) 에 앞서서 해당 범위에 오브젝트들이 포함되어있는지 어떻게 판별할까 ?? 그 방법에 대해서 몇 가지 알아보고 넘어가자. *AABB ( Axis - Aligned Bounding Box ) => 축 정렬 경계

sanghoon23.tistory.com


게임 개발에 필수적인 내용을 담는 명서들을 소개합니다.

 

<유니티 교과서 개정6판>(유니티 최신 버전) 구입 링크
https://link.coupang.com/a/be3P0t

 

유니티 교과서 개정6판

COUPANG

www.coupang.com


<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas

 

리얼-타임 렌더링 4/e

COUPANG

www.coupang.com

 

<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd

 

이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것

COUPANG

www.coupang.com

 

유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)


 

728x90
반응형