태그 : OBB

[3D] 사각형의 충돌체크

사각형 충돌을 위한 사각형에는 두가지 종류가 있습니다.

AABB  : 슬라이드 49 좌표축을 기준으로 만든 박스 Axis Aligned Bounding Box
OBB    : 모델의 좌표축을 기준으로 만든 박스 Oriented Bounding Box


AABB로만 이루어진 사각형끼리의 체크는 간단합니다.
단순히 사각형의 점이 다른 사각형 내부에 있는지만 검사하는것으로 만족하죠.
간단한 윈도우 프로그래밍때 하던 RECT와 POINT간의 체크와 아주 유사합니다.


문제는 한쪽이 OBB일때 발생하죠.
그림과 같이 한쪽이 기울어진 사각형일때, 단순히 점이 사각형 안에 들어가는지로는
제대로 체크가 할수 없습니다. 분명히 4점 모두 들어가지 않지만 이건 충동이 일어났죠.



이럴때 충돌체크는 면과 점과의 거리를 사용하면 구할수 있습니다.
파란 사각형의 각각의 변에 대하여 평면의 방정식을 4개 만듭니다. (2D에선 변이 면)
그리고 빨간색 사각형의 각각의 점에 대해서 각 평면과의 거리를 측정합니다.
만약 하나라도 평면과의 거리가 0보다 크면 두 사각형은 충돌하지 않는것입니다.

1번 평면의 경우, 법선이 X축으로 감소하며 Y축으로 증가하고 있습니다.
이 경우 가장 먼저 만나는 점은 X축으로 가장 크며, Y축으로 가장 작은 점이 됩니다.
이에 해당하는 점은 D가 되겠죠.

중요한건 체크할 모든 점이 이 방정식을 만족하는게 아니라는겁니다.
2번평면의 경우 A,B,C,D모두가 해당평면의 뒤에 있기때문에 문제가 안됩니다만,
4번평면의 경우 만족하는 점은 B뿐입니다.  이렇게 각 평면에 유효점을 구해서 처리합니다.

AABB의 경우는 쉽게 체크해야 할 점을 특정할수 있으니 빠르게 충돌처리를 할수 있습니다.
만약 둘다 OBB일 경우라면 점을 제공하는 사각형의 모든 점중 하나라도 법선내에 포함되면
해당 평면에 대해서는 체크에 성공했다고 하는것이 좋겠죠.
(OBB경우 두 벡터로 바운딩박스를 구현할수 없는데다, 회전도 있기때문에 1:1비교를 예상)


평면을 이용한 사각형 충돌체크는 절두체컬링에서도 쓰이고 있습니다. (AABB로)

3D에서의 오브젝트끼리의 충돌은 모텔축에서만 AABB를 구축해서 사용하면 월드축에서
OBB과 동일한 효과를 가지므로 각 평면만 모델축으로 가져와서 충돌체크하는게
좋지 않을까 싶네요. (아직 구현전이라;;)





by hellz | 2009/05/03 20:26 | Programming | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶