![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5lIvu%2FbtseV8h0RHC%2Fs4X1YstmKpvPF3UfRbzCYk%2Fimg.jpg)
STL 함수를 쓰지 않고 직접 구현하면 다음과 같다. #include #include #include #include #include using namespace std; void print(vector& v); int main(int argc, char* argv[]) { vector setA = {"AA", "AA", "AA", "CC", "DD"}; vector setB = {"AA", "CC", "CC", "EE"}; unordered_map umapA, umapB; set elem; for (string& s : setA) ++umapA[s], elem.emplace(s); for (string& s : setB) ++umapB[s], elem.emplace(s); vector setUnion,..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI8bUy%2FbtshA0XaJV6%2FaMWpBzaSyB5tIkIH6LalR0%2Fimg.png)
이득우의 게임 수학 오일러 각 방식은 짐벌락 현상이 발생하는 데다, 회전 순서에 따라 결과가 바뀌기 때문에 회전 보간이 어렵다. 이 문제는 임의의 축에 대한 평면의 회전 방식인 축-각 회전(Axis-Angle rotation)을 사용하면 해결이 가능하다. 원점을 O(0, 0, 0, 1), 회전 평면의 중심을 O', 회전시킬 점을 P(x, y, z, 1), 회전한 점을 P'이라고 하자. 벡터 u = P - O = (x, y, z)가 된다. 벡터 u를 벡터 n에 투영(Projection)시킨 벡터를 v라고 할 때, 벡터 v = (u·nₑ)·nₑ 벡터 O'P = u - v가 된다. 벡터 O'P'을 가로 성분과 세로 성분으로 분리하면, 가로 성분은 cosθ·(u - v)가 된다. 벡터 O'P'의 세로 성분을 구..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcpvlr0%2Fbtsfe7RJvgI%2F7tlUuR6ZMrl3CqX4Wnf2GK%2Fimg.png)
Advanced Unreal Engine 5 Multiplayer Gameplay Programming GA_Crouch 앉기 능력 C++ 클래스와 상속 받은 BP_GA_Crouch 블루프린트 클래스를 생성한다. Ability Tags에 Ability.Movement.Crouch 태그를 설정한다. 이 태그는 능력의 고유 태그이며, 액터의 Ability System 컴포넌트에서 능력을 실행하거나 취소할 때 사용된다. 앉기 상태를 나타내기 위해 적용할 GE_State_Crouch 이펙트를 생성한다. 단발성이 아니라, 태그를 통해 앉기 상태임를 나타내기 위한 이펙트이므로 Duration Policy를 Infinite로 설정한다. 앉기가 끝날 때 이펙트를 제거한다. Gameplay Effect의 고유 태그인 G..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDOudL%2FbtseHmn3THb%2FKgT0F9BApTOJPi93lcqpK0%2Fimg.png)
Level 2. [1차] 뉴스 클러스터링 문제의 설명 그대로 푼 풀이이다. 모든 영문자를 대문자로 바꾸고, 영문자만 2글자씩 쪼개고, 정렬한 후 set_union(), set_intersection() STL 함수를 이용해 합집합과 교집합의 크기를 구해 해결했다. #include #include #include #include using namespace std; int solution(string str1, string str2) { int answer = 0; vector setA, setB; vector setUnion, setInter; transform(str1.begin(), str1.end(), str1.begin(), ::toupper); transform(str2.begin(), str2..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCmMqn%2Fbtsg1dI47tr%2FXS7tioRKzGPnxPteRfFM00%2Fimg.png)
이득우의 게임 수학 백페이스 컬링은 게임 등에서 최적화를 위해, 시선에 감지되지 않는 메시의 뒷면을 그리지 않는 기법이다. 인덱스 버퍼에는 삼각형 폴리곤을 구성하는 정점의 순서가 나열되어 있는데, 아래와 같다고 해보자. 시선의 입장에서, 좌측 폴리곤은 정점이 시계 방향으로 나열되어 있으므로 반대 방향을 향하게 되고, 우측 폴리곤은 반시계 방향으로 나열되어 있으므로 시선 방향을 보게 된다. 이때 카메라의 시선 방향과 메시가 바라보는 방향을 비교해 마주보면 그리고, 같은 방향을 바라보면 그리지 않는 것이 백페이스 컬링의 알고리즘이다. 삼각형을 이루는 세 정점 P₁, P₂, P₃로 두 개의 벡터 P₁P₂, P₁P₃를 만들고, 이 둘의 외적을 구하면 삼각형이 바라보는 면의 법선 벡터 n을 구할 수 있다. 카메라..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUiaX%2FbtseQsurYBR%2FxYCuXnAc6gqKuFqevcdBlk%2Fimg.png)
Advanced Unreal Engine 5 Multiplayer Gameplay Programming 여러 능력들을 추가하기 전에, 베이스 능력을 만들어 이펙트 적용 같은 자주 쓰이는 기능들을 미리 구현해놓는 것이 좋다. Non Instanced Ability 객체화되지 않은 능력은 읽기 전용(const) CDO(Class Default Object)를 통해 실행되므로, 값(기본 값)을 외부에서 변경할 수 없다. 그러므로, 값이나 상태를 저장할 수 없고 모든 액터는 전부 동일한 CDO를 통해 능력을 실행하게 된다. CDO에 특별하게 관리되는 값이 있다면, 여러 액터가 동일한 CDO를 통해 능력을 실행할 경우 충돌이 생길 수 있다. Instanced Per Actor Ability 따라서 액터나 실행 단..