![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsPJu4%2FbtsjtBncjdJ%2FqjF5nIKzksISeClZNzJwA1%2Fimg.png)
이득우의 게임 수학 뷰 공간의 점이 NDC 좌표까지 변환됐을 때 NDC 좌표의 x, y, z 값이 [-1, 1] 범위에 있다면, 해당 점은 절두체 안쪽에 있음을 의미한다. NDC 좌푯값을 수식으로 표현해보면 다음과 같다. 변환 과정을 거꾸로 추적하면서 수식을 살펴본다. NDC 좌표는 클립 좌표를 마지막 차원의 값 w로 나눈 결과이므로, 클립 좌표로 바꿔 쓰면 다음과 같다. 양 변에 w를 곱한다. 이 상태에서 가꾸로 뷰 공간에서 클립 공간으로 변환한 과정을 살펴본다. 뷰 공간의 점 v를 원근 투영 행렬을 사용해 클립 좌표로 변환하는 수식은 다음과 같다. 원근 투영 행렬을 P.row1부터 P.row4까지 4개의 행 벡터로 표현하면, 위 연산은 행 벡터와 점 v의 내적으로 바꿀 수 있다. 그러면 클립 공간의 ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo8FCF%2FbtssOqR4J4F%2Fc8S40zGj1r73VKZNxfpM20%2Fimg.png)
Advanced Unreal Engine 5 Multiplayer Gameplay Programming 아이템과 겹칠 시 충돌 함수에서 캐릭터의 획득 함수를 바로 실행하거나, 키 입력에 인벤토리 관련 함수를 바로 바인딩하는 고전적인 방법 대신, 이벤트 태그를 전달해 상호작용 하는 방법에 대해 알아본다. 추가적인 Gameplay Ability를 만드는 대신 이벤트와 이벤트 태그를 활용하면, 어떤 능력에도 종속적이지 않은 독립적인 컴포넌트를 만들 수 있다. 우선 인벤토리 컴포넌트에 이벤트 태그 관련 헤더를 추가한다. 각 동작의 게임플레이 태그와 태그를 전달 받았을 때 수행될 콜백 함수를 선언한다. 게임 플레이 태그를 UPROPERTY로 만들어 에디터에서 설정하지 않고, static으로 만들어 다른 클래스에서..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqtjBO%2FbtshyM4K6Jo%2FI1OCqAIZokETkBr7IFxXSK%2Fimg.png)
Level 0. 세로 읽기 C스타일 배열과 같이 copy() 함수를 통해 벡터에도 내부적으로 관리되는 배열에 메모리를 복사할 수 있다. #include #include #include using namespace std; string solution(string my_string, int m, int c) { string answer = ""; size_t n = my_string.length() / m; vector v(n, string(m, '\0')); for (int i = 0; i < n; ++i) copy(my_string.data() + i * m, my_string.data() + (i + 1) * m, &v[i][0]); for (int i = 0; i < n; ++i) answer +=..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmXVV4%2FbtsjkGDl89V%2FN8i8zQEdECERFxqP7uq0t1%2Fimg.png)
이득우의 게임 수학 이제 절두체를 구성하는 6개의 평면에 대한 방정식을 구해 카메라 시야 영역에서 벗어난 게임 오브젝트들을 솎아내는 기능인 절두체 컬링을 구현해본다. 근평면과 원평면을 제외한 4개의 측면 평면은 원점을 포함하기 때문에 원점으로부터의 거리를 의미하는 d의 값은 0이 된다. 따라서, 크기가 1인 법선 벡터만 구하면 4개의 측면 평면에 대한 방정식을 얻을 수 있다. 우선 절두체 상단 평면에 대해 생각해보자. 측면에서 보았을 때 오른쪽은 뷰 공간의 -z축에 대응되고, 위쪽은 y축에 대응된다. 오른쪽을 향하는 벡터 (0, 0, -1)을 반시계 방향으로 θ/2만큼 회전하고 90°만큼 더 회전하면 상단 평면의 법선 벡터를 구할 수 있다. (0, 0, -1)을 반시계 방향으로 θ/2만큼 회전한 벡터는 ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd6JyF%2FbtssDOqKDy6%2FgZZgmQBeCHVDyg06A7NJ7K%2Fimg.png)
Advanced Unreal Engine 5 Multiplayer Gameplay Programming 이번에는 월드에 실체화시킬 아이템 액터를 만들어 본다. ActionGameTypes.h 헤더에 아이템의 상태를 저장하는 열거형을 선언한다. 월드에서 아이템의 실물을 담당할 ItemActor C++ 클래스를 생성한다. 필요한 헤더 포함과 클래스 전방 선언을 해준 후, 함수들을 선언해준다. 월드에 실체화 될 아이템 액터가 구현해야 하는 콜백 함수들과 초기화 함수, 리플리케이션에 필요한 함수들을 선언한다. Equip / Unequip: 인벤토리에 존재하는 상태에서 장착과 해제만 한다. Drop: 인벤토리에서 제거한 후 월드에 실체화시켜 버려버린다. 아이템 실물에 필요한 변수들을 선언한다. 아이템 정적 데이터..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu2epv%2FbtsgG5DQ7jY%2FRfIAYNkvHFHP6PW9vmW8D0%2Fimg.png)
Level 2. 구명보트 배낭 문제에서 남는 공간을 최소화하기 위해서는 부피가 큰 물건부터 넣어야 하듯이, 이 문제에서도 몸무게가 많이 나가는 사람부터 보트에 태워야 한다. 앞뒤에서 삭제가 빈번하므로, vector 대신 deque을 사용했다. #include #include #include #include using namespace std; int solution(vector people, int limit) { int answer = 0; deque deq(people.begin(), people.end()); sort(deq.begin(), deq.end()); do { int total = limit; bool bSuccess = false; while (!deq.empty() && (deq.ba..