-
[DirectX11] 기본 게임 도형(Sphere,AABB,OBB등)2024년 03월 14일
- 유니얼
-
작성자
-
2024.03.14.:27
728x90DirectX 11로 게임 엔진 아키텍처 만들기
게임 개발에서 3D 기본 도형과 관련된 수학 개념은 중요한 역할을 차지합니다. 이러한 개념들은 게임 내 객체의 위치 파악, 움직임 계산, 충돌 감지 등 다양한 기능을 구현하는 데 필수적입니다. 이번 글에서는 게임 개발에 자주 사용되는 3D 기본 도형의 수학적 개념과 그 활용 방안에 대해 설명하겠습니다.
참고강의 링크:
3D 기본 도형의 종류와 수학적 개념
점(Point3D)
3차원 공간에서 한 위치를 나타내는 가장 기본적인 요소입니다. (x, y, z) 좌표로 표현됩니다.
//************ // Point3D //************ // 3차원 점을 나타내는 별칭입니다. Vec3 타입을 사용합니다. using Point3D = Vec3;
선(Line3D)
두 점을 잇는 직선으로, 방향이 있거나 없을 수 있습니다. 선의 길이는 두 점 사이의 거리로 계산됩니다.
//************ // Line3D //************ // 선(Line)을 3차원 공간에서 표현합니다. 시작점과 끝점을 갖습니다. struct Line3D { Point3D start = Point3D(0.f); // 시작점, 기본값은 원점입니다. Point3D end = Point3D(0.f); // 끝점, 기본값 역시 원점입니다. float Length() { return Vec3::Distance(start, end); } // 선의 길이를 계산합니다. float LengthSq() { return Vec3::DistanceSquared(start, end); } // 선의 길이의 제곱을 계산합니다. 계산 비용을 줄이기 위해 사용됩니다. };
광선(Ray3D)
시작점과 특정 방향을 가지고 무한히 연장되는 선입니다. 광선은 시야 검사나 광선 추적 등에 사용됩니다.
//************ // Ray3D //************ // 광선(Ray)을 3차원 공간에서 표현합니다. 원점과 방향 벡터를 갖습니다. struct Ray3D { Point3D origin = Point3D(0.f); // 광선의 시작점, 기본값은 원점입니다. Vec3 direction = Vec3(0.f); // 광선의 방향, 기본값은 (0,0,0)입니다. void NormalizeDirection() { direction.Normalize(); } // 방향 벡터를 정규화합니다. static Ray3D FromPoints(const Point3D& from, const Point3D& to) { return Ray3D{ from, to - from }; } // 두 점으로부터 광선을 생성합니다. };
구(Sphere3D)
중심점과 반지름으로 정의되며, 모든 점이 중심점으로부터 일정 거리(반지름)에 위치하는 3차원 도형입니다.
//************ // Sphere3D //************ // 구(Sphere)를 3차원 공간에서 표현합니다. 중심 위치와 반지름을 갖습니다. struct Sphere3D { Point3D position; // 구의 중심 위치입니다. float radius; // 구의 반지름입니다. };
AABB(Axis-Aligned Bounding Box)
축에 정렬된 경계 상자로, 3차원 객체를 감싸는 데 사용됩니다. 각 축에 대해 최소값과 최대값으로 정의됩니다.
//************ // AABB3D //************ // 축에 정렬된 경계 상자(Axis-Aligned Bounding Box, AABB)를 3차원 공간에서 표현합니다. struct AABB3D { Point3D position = Vec3(0.f); // AABB의 중심 위치입니다. Vec3 size = Vec3(1.f, 1.f, 1.f); // AABB의 크기(각 축에 대한 반 길이)입니다. // AABB의 최소 좌표를 계산합니다. static Vec3 GetMin(const AABB3D& aabb) { Vec3 p1 = aabb.position + aabb.size; Vec3 p2 = aabb.position - aabb.size; return Vec3(fminf(p1.x, p2.x), fminf(p1.y, p2.y), fminf(p1.z, p2.z)); } // AABB의 최대 좌표를 계산합니다. static Vec3 GetMax(const AABB3D& aabb) { Vec3 p1 = aabb.position + aabb.size; Vec3 p2 = aabb.position - aabb.size; return Vec3(fmaxf(p1.x, p2.x), fmaxf(p1.y, p2.y), fmaxf(p1.z, p2.z)); } // 최소 및 최대 좌표를 이용하여 AABB를 생성합니다. static AABB3D FromMinMax(const Vec3& min, const Vec3& max) { return AABB3D{ (min + max) / 2, (max - min) / 2 }; } };
OBB(Oriented Bounding Box)
AABB와 유사하지만, 임의의 방향을 가질 수 있는 경계 상자입니다. 회전을 포함하여 객체를 더 정확하게 감쌀 수 있습니다.
//********* // OBB3D //********* // 방향이 있는 경계 상자(Oriented Bounding Box, OBB)를 3차원 공간에서 표현합니다. struct OBB3D { Point3D position = Vec3(0.f); // OBB의 중심 위치입니다. Vec3 size = Vec3(1.f, 1.f, 1.f); // OBB의 크기입니다. Matrix orientation; // OBB의 방향을 나타내는 변환 행렬입니다. //Vec4 quaternion; //Vec3 rotation => 짐벌락 이슈 };
평면(Plane3D)
3차원 공간에서 평면을 정의하는 데 사용되며, 법선 벡터와 원점으로부터의 거리로 표현됩니다.
//*********** // Plane3D //*********** //삼각형 방식 //노멀 정점 1개 //노멀 정점 3개 // 평면(Plane)을 3차원 공간에서 표현합니다. 법선 벡터와 원점으로부터의 거리를 갖습니다. struct Plane3D { Vec3 normal; // 평면의 법선 벡터입니다. float distance; // 원점으로부터의 거리입니다. };
삼각형(Triangle3D)
3개의 점으로 구성되며, 3D 모델을 구성하는 기본 단위입니다. 각 점은 3차원 공간의 좌표를 가집니다.
//************* //Triangle3D //************* // 삼각형(Triangle)을 3차원 공간에서 표현합니다. 세 개의 꼭짓점을 갖습니다. struct Triangle3D { union { struct { Point3D a; // 첫 번째 꼭짓점입니다. Point3D b; // 두 번째 꼭짓점입니다. Point3D c; // 세 번째 꼭짓점입니다. }; Point3D points[3]; // 꼭짓점 배열입니다. float values[9]; // 꼭짓점 좌표 값 배열입니다. }; };
구간(Interval3D)
최소값과 최대값으로 정의되는 구간입니다. 수학적 계산에서 범위를 제한하는 데 사용됩니다. 3D 기본 도형의 수학적 활용 3D 기본 도형은 게임 내에서 객체 간의 상호작용, 충돌 감지, 경로 계획 등 다양한 목적으로 활용됩니다. 예를 들어, 구(Sphere3D)는 간단한 충돌 감지에 사용되며, AABB는 공간 분할과 빠른 충돌 검사에 효과적입니다. 또한, 삼각형(Triangle3D)은 메시(mesh)를 구성하고 표면의 세부 사항을 나타내는 데 사용됩니다.
// 구간(Interval)을 3차원 공간에서 표현합니다. 최소 및 최대 값을 갖습니다. struct Interval3D { float min; // 구간의 최소값입니다. float max; // 구간의 최대값입니다. };
결론
3D 기본 도형과 관련된 수학 개념은 게임 개발에서 필수적입니다. 각 도형은 게임 내에서 특정 기능을 수행하며, 이러한 도형들을 수학적으로 정확하게 계산하고 활용하는 능력은 게임의 품질과 성능에 큰 영향을 미칩니다. 게임 개발자로서 이러한 수학적 개념을 잘 이해하고 적용하는 것은 게임을 더욱 흥미롭고 다이내믹하게 만드는 데 중요한 역할을 합니다.
반응형다음글이전글이전 글이 없습니다.댓글