Make Unreal REAL.
article thumbnail
직선의 방정식

이득우의 게임 수학 평면의 방정식은 내적에 기반을 두기 때문에 2차원 공간에서도 동일하게 활용할 수 있다. - (ax₀ + by₀)는 상수이므로 c로 치환한다. 직선의 방정식은 다음과 같다. 법선 벡터 n의 크기가 1이면, c의 절댓값은 원점에서 직선까지의 최단 거리를 의미한다. 만약, 크기가 1이 아닌 법선 벡터 v(a', b')를 사용한다면 최단 거리는 다음과 같다. 3차원 평면과 마찬가지로 2차원 직선도 앞뒷쪽을 가진다. 임의의 점 P(x₁, y₁)가 법선 벡터 n(a, b)과 c로 정의된 평면의 바깥쪽에 있는지, 안쪽에 있는지 판별하는 수식은 다음과 같다. 이 수식에 절댓값을 취하면 젝선에서 P까지의 최단 거리가 된다. 직선의 방정식도 정규화할 수 있다.

article thumbnail
인벤토리 컴포넌트

Advanced Unreal Engine 5 Multiplayer Gameplay Programming InventoryComponent C++ 클래스를 생성한다. 컴포넌트 리플리케이션 네트워크 리플리케이션에 대한 컴포넌트 셋업하기 입니다. docs.unrealengine.com 헤더를 포함하고 InitializeComponent(), ReplicateSubobjects(), GetLifetimeReplicatedProps() 함수를 오버라이드한다. ReplicateSubobjects() 함수는 액터 컴포넌트가 아닌, 서브오브젝트를 복제하고자 할 때 사용한다. 아이템 정적 정보 클래스를 통해 아이템 객체 배열인 InventoryList에 아이템을 추가하고 삭제하는 기능을 제공한다. 추가의 경우, 전달 받..

article thumbnail
Level 2. N개의 최소공배수

Level 2. N개의 최소공배수 아래처럼 최대공약수를 이용해 계산하면 [2, 3, 4]를 대입할 때 오답이 나온다. // 이 풀이는 틀린 풀이다. #include #include #include #include using namespace std; int GCD(int a, int b) { return b ? GCD(b, a % b) : a; } int solution(vector arr) { int gcd = arr[0]; for (int i = 1; i < arr.size(); ++i) gcd = GCD(gcd, arr[i]); return accumulate(arr.begin(), arr.end(), 1, ::multiplies()) / pow(gcd, arr.size() - 1); } 순서대로 ..

article thumbnail
평면의 방정식

이득우의 게임 수학 다수의 게임 오브젝트가 월드 공간에 넓게 퍼져 있는 경우, 카메라 시야(절두체) 밖에 위치한 게임 오브젝트까지 모두 그리는 것은 비효율적이다. 그래서 게임에서 그래픽을 구현할 때는 절두체 영역에 속한 게임 오브젝트만을 그리고, 영역 밖에 있는 게임 오브젝트를 파악하고 걸러내는 기능을 절두체 컬링(Frustum culling)이라고 한다. 절두체 컬링은 절두체를 구성하는 6개의 평면에 대해 각각 평면의 방정식을 세워 대상 게임 오브젝트가 평면의 바깥에 있는지 확인하는 정차로 진행된다. 6개 평면 중 하나라도 바깥쪽에 위치해 있다면, 그리기에서 제외된다. 절두체 컬링에 앞서 평면의 방정식부터 알아보자. 세 점이 주어지면 두 벡터를 생성해 평면 상의 모든 점을 생성할 수 있다. 따라서 하나..

article thumbnail
인벤토리 구조체 선언

Advanced Unreal Engine 5 Multiplayer Gameplay Programming 인벤토리 아이템 객체로 사용할 InventoryItemInstance UObject C++ 클래스를 생성한다. 빌드 설정에 NetCore 모듈을 추가한다. 헤더를 추가하고 초기화에 사용할 Init() 함수를 선언한다. 객체가 네트워크를 통해 참조되기 위해서는 IsSupportedForNetworking() 함수를 오버라이드해야 한다. 리플리케이션에 필요한 GetLifetimeReplicatedProps() 함수를 오버라이드한다. 아이템 객체의 정적 데이터 클래스의 CDO를 반환하는 헬퍼 함수도 선언한다. CDO에서 아이템의 정적 정보를 가져오기 위한 클래스 정보와 장착 여부를 저장해본다. 모든 속성은 ..

article thumbnail
Level 0. 글자 지우기

Level 0. 글자 지우기 indices의 원소 범위가 주어지지 않아. 배열 대신 unordered_map을 사용했다. 문자열을 붙이게 되면 메모리 재할당이 빈번하게 발생하므로, 미리 크기를 할당해놓고 사용했다. #include #include #include using namespace std; string solution(string my_string, vector indices) { size_t len = my_string.length(), size = indices.size(); string answer(len - size, '\0'); unordered_map umap; for (int index : indices) umap[index] = true; for (int i = 0, j = 0; ..

검색 태그