DX11

원 충돌(코드)

TIN9 2022. 1. 2.
반응형

원 충돌에서 중요한 점은

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

댓글