Math & Physics
Beginner
Unity 2021.3+ / Unity 6
원(Circle)과 축 정렬 경계 상자(AABB) 간의 최단 접점 클램핑 충돌 검사
무거운 물리 엔진 없이도 원형 캐릭터/투사체와 직사각형 타일 사이의 교차 여부와 침투 깊이(Penetration Depth)를 구하는 2D 충돌 판정 수학.
#Math #Physics #Collision #Geometry #2D
핵심 개념상자(AABB) 내부에서 원 중심에 가장 가까운 최단 접점 $C$를 구하기 위해 중심 좌표를 상자의 최소/최대 범위로 클램핑(
Clamp)합니다. 원 중심과 접점 $C$ 사이의 거리가 원의 반지름 $R$보다 작으면 두 도형은 충돌한 것입니다.1. Circle vs AABB 판정 C# 구현
using UnityEngine;
public static class Collision2DUtil
{
public static bool CheckCircleAABB(
Vector2 circleCenter, float radius, Rect box, out Vector2 normal, out float depth)
{
normal = Vector2.zero;
depth = 0f;
// 1. 박스 영역으로 가장 가까운 점 클램핑
float closestX = Mathf.Clamp(circleCenter.x, box.xMin, box.xMax);
float closestY = Mathf.Clamp(circleCenter.y, box.yMin, box.yMax);
Vector2 closestPoint = new Vector2(closestX, closestY);
// 2. 거리 검사
Vector2 diff = circleCenter - closestPoint;
float distSqr = diff.sqrMagnitude;
if (distSqr < radius * radius)
{
float dist = Mathf.Sqrt(distSqr);
normal = dist > 0.0001f ? diff / dist : Vector2.up;
depth = radius - dist;
return true;
}
return false;
}
}