![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtED5d%2FbtsiRFXyoeJ%2FuB6R4ehRdotP0SIlR72Zh1%2Fimg.png)
이득우의 게임 수학 원근 투영 행렬을 활용해 3차원의 물체를 원근감 있게 표현해봤지만, 텍스처를 입힌다면 추가로 고려할 사항이 발생한다. 카메라의 시선을 기준으로 할 때, 가장 가까운 곳에 위치한 오브젝트를 가장 앞쪽에 그려야 하기 때문이다. 이를 위해 물체가 카메라로부터 얼마나 떨어져 있는지에 대한 정보를 기록해 앞에 있는 물체를 나중에 그리도록 하는 것이다. 카메라로부터 얼마나 떨어져 있는지 파악할 수 있는 데이터를 깊이(Dpeth)라고 한다. 2차원 NDC에 깊이 값을 추가하면 3차원 NDC로 확장된다. 카메라의 속성으로부터 원근 투영 행렬을 생성하기 위해서는 카메라에 추가 속성을 부여해야 한다. 카메라에서 깊이에 대한 속성은 근평면(Near plane)과 원평면(Far plane)으로 나타낸다. ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3WrDb%2FbtsgKn0NAU8%2FYIJUBxmivRDynNLDlH7ypK%2Fimg.png)
Advanced Unreal Engine 5 Multiplayer Gameplay Programming GAS를 통해 서로 다른 능력 간의 관계를 설정할 때, 항상 C++로 모든 것을 구현할 필요는 없다. 현재 점프 중에 앉기를 수행할 수 있도록 되어 있다. Cancel Abilities with Tag 여기에 등록된 태그를 Ability Tags로 가진 능력은, 이 능력이 활성화되면 종료된다. Block Abilities with Tag 여기에 등록된 태그를 Ability Tags로 가진 능력은, 이 능력이 활성화 상태이면 실행할 수 없다. Activation Owned Tags 여기에 등록된 상태 태그는 액터의 Ability System Component에 추가된다. Activation Require..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZhqMM%2FbtsfA3tCFH8%2FU6B1GZ8WKcQW1Bp016uaR0%2Fimg.png)
Level 0. 수열과 구간 쿼리 2 정렬하지 않고 순회하면서 k보다 큰 원소들에 대해서만 최솟값을 구하면 한 쿼리당 O(n) 시간에 해결할 수 있다. #include #include #include using namespace std; vector solution(vector arr, vector queries) { size_t size = queries.size(); vector answer(size); for (int i = 0; i < size; ++i) { int t_min = 1'000'001; for (int j = queries[i][0]; j
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuNiJn%2FbtsitHbZzcd%2F9H0nVazG3pYJKLqGvGkev1%2Fimg.png)
이득우의 게임 수학 NDC는 2차원 평면의 좌표지만, 원근 투영 행렬을 사용하도록 계산 과정을 두 단계로 구분하고 사용하는 벡터의 값도 한 차원 높였다. 이렇게 한 차원 높인 벡터를 사용하는 것을 게임 제작에서는 동차 좌표계(Homogeneous coordinate system)를 사용한다고 표현한다. 동차 좌표계의 동차는 모든 차수가 같음을 의미하는 수학 용어다. 원근 투영을 위해 하나의 점으로 모이는 사각뿔의 사영 공간과 동차 좌표계가 어떤 연관이 있는지 알아보자. 3차원 사영 공간에서 Z축에 평행하게 점을 이동시키면, 투영된 점은 사영 공간의 점이 카메라로부터 가까울수록 원점에서 멀어지고, 카메라로부터 멀어질수록 원점에 가까워지는 반비례 관계를 가진다. 3차원 사영 공간의 점은 (x', y', 'z..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8MzF3%2Fbtsg1bX0abO%2FLCuFCfV6eS48LbcE90hKK1%2Fimg.png)
Advanced Unreal Engine 5 Multiplayer Gameplay Programming 달리기 Ability를 생성하기 전에, Tick처럼 동작하며 벽 달리기를 수행할 Ability Task C++ 클래스를 생성한다. Ability Task는 델리게이트를 통해 다룰 수 있다. 벽 달리기를 수행할 벽면이 정해졌을 때 발동할 FOnWallRunWallSideDeterminedDelegate 델리게이트를 정의한다. 콜백 함수에는 벽면의 방향을 전달한다. 벽 달리기가 끝났을 때 발동할 FOnWallRunWallFinishedDelegate 델리게이트를 정의한다. 더 이상 벽 달리기를 수행할 수 없을 때이다. 필요한 클래스를 전방 선언한다. 델리게이트를 선언한다. 이 함수는 매우 중요하다. 모든 ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbgUyj%2FbtsfpdiMhnE%2F43D8Msi3l3prkQkfgsfkH1%2Fimg.png)
Level 0. 두 수의 합 숫자를 앞에 붙이면서 불필요한 밀기 연산이나 메모리 재할당을 최소화하기 위해, 뒤로 붙인 후 마지막에 역순으로 재배열해줬다. #include #include using namespace std; string solution(string a, string b) { string answer = ""; size_t lenA = a.length(), lenB = b.length(); int last = max(lenA, lenB), carry = 0; for (int i = 1; i