게임 개발 자료
OBB 와 Point 충돌체크 (내적의 기하학적 의미 활용)
원소랑
2024. 1. 19. 17:09
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
<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas
<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd
유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h
(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)
728x90
반응형