오브젝트 충돌{원과 원, 사각형과 사각형(AABB, OBB)}

김민구·2025년 2월 12일
0

유니티

목록 보기
4/6

게임에서 오브젝트의 충돌을 다룰 때 크게 원과 원의 충돌과, 사각형과 사각형의 충돌이 있다.

  1. 원과 원의 충돌
    ㄴ 원과 원의 충돌을 계산할 때, 두 원의 중심 간 거리와 반지름의 합을 비교한다.
  • 충돌 조건은 두 원의 중심 간 거리가 두 원의 반지름 합보다 작거나 같을 때이다.

  • 충돌을 감지하기 위해 두 공의 사이의 거리를 구해야 한다.
    ㄴ 공의 중심 좌표의 차이를 통해 피타고라스의 공식으로 구할 수 있다.

  • 원 1의 중심 : (x1, y1), 반지름 : r1

  • 원 2의 중심 : (x2, y2), 반지름 : r2


충돌 감지 함수() {
    공1의 반지름 = 30;
    공2의 반지름 = 50;
    공1 중심위치벡터 = createVector(100,100);
    공2 중심위치벡터 = createVector(150,170);

    두 공 중심을 잇는 벡터 = p5.Vector.sub(공2 중심위치벡터, 공1 중심위치벡터);
    두 공 중심 사이 거리 = 두 공 중심을 잇는 벡터.mag(); 
    두 공 반지름 합 = 공1의 반지름 + 공2의 반지름;
    if (두 공 중심 사이 거리 <= 두 공 반지름 합) {
        충돌!!!
    }
}

  • 원1의 반지름과 원2의 반지름의 합보다 원1의 중심점과 원2의 중심점의 직선 거리가 작으면 충돌!
  1. 사각형과 사각형의 충돌
    ㄴ 사각형과 사각형 충돌을 처리할땐 AABB(Axis-Aligned Bounding Box)와 OBB(Oriented Bounding Box)라는 두 가지 방법이 있다.

1) AABB는 정렬된 두 사각형 간 충돌을 처리로 두 사각형이 서로 겹치는지 확인하기 위해 각각의 사각형의 꼭지점, 혹은 면의 좌표가 다른 사각형 안으로 들어갔을때 충돌
ㄴ AABB는 두 사각형이 평행할때(그리고 사각형이 좌표축하고도 평행할때) 충돌하는걸 계산할 수 있다.

  • AABB충돌 조건

    A가 왼쪽 B가 오른쪽 사각형일때
    ㄴ A의 오른쪽 모서리 >= B의 왼쪽 모서리.
    ㄴ A의 왼쪽 모서리 <= B의 오른쪽 모서리.
    ㄴ A의 아래쪽 모서리 >= B의 위쪽 모서리.
    ㄴ A의 위쪽 모서리 <= B의 아래쪽 모서리.

2) OBB란 방향성 있는 경계 상자라는 뜻으로 OBB는 3D공간에서 물체의 충돌을 검사하는데 사용되는 방법으로 물체를 감싸는 직육면체 형태의 상자이다.
ㄴ 물체의 회전과 크기를 고려하여 충돌 여부를 판단한다 즉 AABB와 달리 평행하지 않은 사각형들의 충돌을 계산할때 사용된다.

  • OBB충돌 검사는 "분리 축 정리(Separating Axis Theorem, SAT)"를 기반으로 한다.
    ㄴ SAT는 두 물체가 충돌하지 않으면 두 물체를 분리하는 축이 존재한다는 정리
    ex) SAT, CJK 알고리즘 두가지 알고리즘이 대표적이나 이번엔 SAT만 정리해 본다.
  • 간단히 OBB충돌은 우측 아래 사진과 같이 3D인 정육면체 혹은 박스형태의 물체를 특정 평면에서 바라볼때 기준인 면을 가상으로 연장하여, 연장된 가상의 면이 충돌하는지를 체크하는 것이다.

ex) 회전한 이미지의 틀을 좌표측과 평행한 사각형으로 감싸 충돌을 AABB로 처리할 수도 있다.

profile
C#, Unity

0개의 댓글