TOOLS GAMES DEVLOG DOCS ABOUT CONTACT
HOME > DOCS > Math & Physics > 원(Circle)과 축 정렬 경계 상자(AABB) 간의 최단 접점 클램핑 충돌 검사
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# 구현

Collision2DUtil.cs
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;
    }
}

참고자료 & 관련 링크