게임 개발 자료

OBB 와 Point 충돌체크 (내적의 기하학적 의미 활용)

원소랑 2024. 1. 19. 17:09
728x90

OBB(Oriented Bounding Box) 정의. 위치와 크기, 회전 행렬(orientation)을 갖는다.

struct OBB3D
{
	Point3D position;
	Vec3 size;
	Matrix orientation;
}

 

한 점이 OBB 에 충돌하는지 체크는 내적 연산을 활용.

OBB의 중점에서 testPoint 까지의 벡터 dir를 계산.

OBB의 회전 좌표계의 각 축으로 dir을 투영(Projection) 시킨다.이 때 내적을 활용. 내적 결과값은 투영시킨 벡터의 길이와 다른 벡터(각 축 벡터)의 길이를 곱한 값인데, 각 축 벡터의 길이는 1이므로 거리(distance)의 의미만 남음.

이 거리(distance)와 OBB의 크기를 체크해서 point 가 obb 에 충돌했는지 체크할 수 있다.

bool PointInOBB(const Point3D& point, const OBB3D& obb)
{
	Vec3 dir = point - obb.position;

	vector<Vec3> axis;
	axis.push_back(obb.orientation.Right());
	axis.push_back(obb.orientation.Up());
	axis.push_back(obb.orientation.Backward());

	vector<float> size;
	size.push_back(obb.size.x);
	size.push_back(obb.size.y);
	size.push_back(obb.size.z);

	for (int32 i = 0; i < 3; i++)
	{
		float distance = dir.Dot(axis[i]);

		if (distance > size[i])
			return false;
		if (distance < -size[i])
			return false;
	}

	return true;
}

게임 개발에 필수적인 내용을 담는 명서들을 소개합니다.

 

<유니티 교과서 개정6판>(유니티 최신 버전) 구입 링크
https://link.coupang.com/a/be3P0t

 

유니티 교과서 개정6판

COUPANG

www.coupang.com


<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas

 

리얼-타임 렌더링 4/e

COUPANG

www.coupang.com

 

<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd

 

이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것

COUPANG

www.coupang.com

 

유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)


 

728x90
반응형