반응형
원 충돌에서 중요한 점은
A박스의 x, y축으로 투영을 진행하면 겹치지 않는 상황인데도 겹치게 나오는 상황이 생긴다
(아래의 사진처럼)
그래서 CenterDir방향으로의 축도 한 번추가로 투영을 해주어야 한다.(3번 이미지 참고)
// 박스 원 충돌
bool CCollision::CollisionBox2DToCircle(CollisionResult& SrcResult, CollisionResult& DestResult, const Box2DInfo& Src, const CircleInfo& Dest)
{
Vector2 CenterDir = Src.Center - Dest.Center;
// Box x축 투영
Vector2 Axis = Src.Axis[0];
float CenterProjDist = abs(CenterDir.Dot(Axis));
float r1, r2;
// Src의 x축 y축에다가 투영을 하기때문
// Src는 Length그대로가 나온다
// 원의 경우 어디로 투영을 하든지 반지름 고정
r1 = Src.Length.x;
r2 = Dest.Radius;
// 센터의 투영거리가 r1 + r2보다 크면 return false;
if (CenterProjDist > r1 + r2)
return false;
// 상자의 y축 투영
Axis = Src.Axis[1];
CenterProjDist = abs(CenterDir.Dot(Axis));
r1 = Src.Length.y;
r2 = Dest.Radius;
if (CenterProjDist > r1 + r2)
return false;
// 상자의 중심방향으로 투영
// 각 센터끼리의 거리를 Normalize해서 투영
Axis = CenterDir;
Axis.Normalize();
// 센터와 센터의 길이
CenterProjDist = CenterDir.Length();
r1 = abs(Src.Axis[0].Dot(Axis) * Src.Length.x) +
abs(Src.Axis[1].Dot(Axis) * Src.Length.y);
// 원은 어디에 투영을 해도 반지름이 나옴
r2 = Dest.Radius;
if (CenterProjDist > r1 + r2)
return false;
return true;
}
반응형
'DX11' 카테고리의 다른 글
Box2D To Point 충돌 (0) | 2022.01.05 |
---|---|
Box2D To Pixel 충돌 (0) | 2022.01.05 |
obb 충돌 관련(코드) (0) | 2022.01.02 |
2021-11-29 DX11 DInput관련 (0) | 2021.11.29 |
2021-11-28 ~ DX11 RenderManager (0) | 2021.11.29 |
댓글