• 티스토리 홈
  • 프로필사진
    유니얼
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
유니얼
  • 프로필사진
    유니얼
    • 분류 전체보기 (295)
      • Unity (17)
        • 게임 개발 (5)
      • Unreal (24)
        • 게임 개발 (20)
      • DirectX (36)
      • 코딩테스트 (91)
        • 프로그래머스 (25)
        • 백준 (66)
      • Google Workspace (1)
      • Programing (102)
        • C# (68)
        • C++ (24)
        • JavaScript (10)
      • 게임 서버 프로그래밍 (17)
      • Web (6)
        • 슈퍼코딩 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
    등록된 댓글이 없습니다.
  • 최근 공지
    등록된 공지가 없습니다.
# Home
# 공지사항
#
# 태그
# 검색결과
# 방명록
  • [DirectX11] 기본 게임 도형(Sphere,AABB,OBB등)
    2024년 03월 14일
    • 유니얼
    • 작성자
    • 2024.03.14.:27
    728x90

    DirectX 11로 게임 엔진 아키텍처 만들기

    게임 개발에서 3D 기본 도형과 관련된 수학 개념은 중요한 역할을 차지합니다. 이러한 개념들은 게임 내 객체의 위치 파악, 움직임 계산, 충돌 감지 등 다양한 기능을 구현하는 데 필수적입니다. 이번 글에서는 게임 개발에 자주 사용되는 3D 기본 도형의 수학적 개념과 그 활용 방안에 대해 설명하겠습니다.

    참고강의 링크:

    https://www.inflearn.com/course/directx11-%EA%B2%8C%EC%9E%84%EA%B0%9C%EB%B0%9C-%EB%8F%84%EC%95%BD%EB%B0%98/dashboard

     

    [게임 프로그래머 도약반] DirectX11 입문 강의 - 인프런

    게임 프로그래머 공부에 있어서 필수적인 DirectX 11 지식을 초보자들의 눈높이에 맞춰 설명하는 강의입니다., [사진][사진] [사진] 게임 개발자는 Unreal, Unity만 사용할 줄 알면 되는 거 아닌가요? 엔

    www.inflearn.com

    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 => 짐벌락 이슈
    };
    AABBOBB

    평면(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 기본 도형과 관련된 수학 개념은 게임 개발에서 필수적입니다. 각 도형은 게임 내에서 특정 기능을 수행하며, 이러한 도형들을 수학적으로 정확하게 계산하고 활용하는 능력은 게임의 품질과 성능에 큰 영향을 미칩니다. 게임 개발자로서 이러한 수학적 개념을 잘 이해하고 적용하는 것은 게임을 더욱 흥미롭고 다이내믹하게 만드는 데 중요한 역할을 합니다.

    반응형
    다음글
    다음 글이 없습니다.
    이전글
    이전 글이 없습니다.
    댓글
조회된 결과가 없습니다.
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
목차
표시할 목차가 없습니다.
    • 안녕하세요
    • 감사해요
    • 잘있어요

    티스토리툴바