본문 바로가기

Macro 분기 vulkan 래핑 작업을 하던 중 로그 출력 및 에러 처리에 대한 필요성이 생겨 어떻게 구현할 지 고민했다. 생각해본 구현 요구사항은 다음과 같다.    1. 간단히 사용할 수 있어야 한다.    2. std library의 의존성을 최소화 해야 한다.    3. 어떤 파일의 몇 번째 줄에서 에러가 발생했는지 출력 할 수 있어야 한다.    4. 에러 혹은 로그의 수준에 따라 출력 포맷을 다르게 할 수 있어야 한다.    5. 에러 코드의 출력 여부를 선택할 수 있어야 한다. 요구사항 2 에 의해 선언부와 정의부를 분리해야 하므로, inline 및 template를 사용할 수 없다.요구사항 3 에 의해 매크로를 사용해야 한다. (__FILE__, __LINE__ 사용)  - 호출 한 시점의 파일과 줄 번..
C++로 GetComponent<T>() 구현하기 유니티에서 컴포넌트를 찾아주는 GetComponent() 를 C++로 어떻게 구현할 수 있을지 고민했다. 먼저 GetComponent 함수의 형태를 보면 인자가 없으며 template를 사용한다는 것을 알 수 있고,함수의 결과로 컴포넌트를 찾아서 형변환하여 포인터 혹은 레퍼런스로 반환할 것이라는 예상을 할 수 있다. 그런데, 레퍼런스는 선언과 참조를 같이 해야하므로 사용할 수 없다. 따라서, 포인터로 component를 저장한다. template T* getComponent() { ... return static_cast(...);} 그럼, 여기서 "컴포넌트를 어떻게 구분하여 찾을 것인가?" 를 고민해봐야 한다. 객체는 다수의 컴포넌트를 가질 수 있으므로 삽입, 삭제, 검색 속도가 빠르..
직선의 벡터 방정식으로 두 직선의 교점 찾기 들어가기 앞서, 직선의 벡터 방정식에 대한 이해가 필요하다. 글 참조 위의 글에서 직선의 벡터 방정식은 직선 L상의 어떤 한 점의 좌표를 의미한다고 했다.따라서, 두 직선 L1, L2가 만나면서 생기는 교점의 좌표는 두 벡터 방정식이 같은 경우를 말한다.   여기서, 교점의 위치를 결정하기 위해서 t값 혹은 u값을 구해야한다.직선 L1을 기준으로 하여 교점을 구하기위해 t값에 대해 정리하면 다음과 같다.   이 때, t는 실수값이므로, 벡터를 실수로 만들어주기 위해서 벡터 b와 벡터 d의 외적을 분모/분자에 내적한다.그리고 t에 대해 정리하면 다음과 같은 식을 도출할 수 있다.   위의 식에서 분모가 0이 아닐 때에만 두 직선의 교점이 생긴다.    > 만약 직선이 아닌 선분 내에서 교차하는지를 알고싶다..
극좌표계 (Polar Coordinate System) 극좌표계는 2차원 좌표계로, 평면 위의 임의의 위치 (점) 를 각도와 거리를 이용해서 표현한다.   어떤 극점 O 와, 극축 L 을 기준으로 삼으며 회전 방향은 다음과 같다.반시계 방향 (CCW) 이 양의 회전방향 (+Θ), 시계 방향 (CW) 이 음의 회전방향 (-Θ) 을 뜻한다. 여기서, 점 P를 직각좌표계의 좌표 (x, y)로 변환해보자. 반지름이 r인 어떤 원주상의 점 P라고 생각할 수 있다.이 때, x와 y의 좌표값, 그리고 r 값을 구해보면 다음과 같다.   삼각함수를 이용하여 x, y 좌표값을 알 수 있고, 피타고라스 정리를 통해 r값을 알 수 있으며,역삼각함수 중 아크탄젠트 함수를 사용하여 각 Θ도 알아낼 수 있다.  Referencehttps://en.wikipedia.org/wiki/P..
평면의 벡터 방정식 앞서 알아보았던 직선의 벡터 방정식처럼 평면의 벡터 방정식에 대해서도 알아본다.  위 사진처럼 값을 알고 있는 점 P0와, normal 벡터 n이 있을 때, 벡터 n과 수직 관계인 모든 점들을 모아보자.그럼 아래의 사진처럼 점들은 어떤 평면 위에 위치함을 생각해볼 수 있으며, 그 중 어떤 한 점을 P라고 하자.  수직 관계인 두 벡터의 내적은 0이므로, 이를 이용하기 위해 어떤 점 P를 향하는 벡터를 구하면 다음과 같다.   따라서, 다음과 같이 어떤 점 P를 사용하여 표현된 평면의 벡터 방정식을 얻을 수 있다.   이 식에서 중요한 점은 두 벡터 n과 p의 관계가 수직이어야 성립된다는 점이다.또한, 위의 식을 통해 벡터가 아닌 평면의 (스칼라) 방정식을 도출할 수도 있다. 벡터를 각각의 축 성분에 대해..
Unreal Engine 5 소스코드 편집기로 VScode 사용하기 Unreal Engine (이하 UE) 은 기본적으로 Visual Studio IDE를 사용하도록 세팅되어 있지만 너무 무겁다.그래서 비교적 가벼운 VScode를 기본 소스코드 편집기로 사용하는 방법에 대해 찾아봤고, 이에 대해서 기록한다. UE 5.3.2 버전, Windows 11 OS를 기준으로 작성된 글이므로 이후로 바뀔 가능성이 있다. 1. VScode 세팅1) VScode Extension에서 C# Dev Kit (Microsoft) 을 설치한다. 2) 만약 .NET SDK가 설치되어 있지 않다면 설치한다. (글 작성 기준 .NET SDK 8.0) 3) VScode Extension에서 C/C++ Extension Pack (Microsoft) 을 설치한다. 2. Unreal Engine 에디터..
직선의 벡터 방정식 일반적인 직선의 방정식 y = mx + b 처럼, 벡터를 이용하여 직선을 표현하는 직선의 벡터 방정식을 알아본다. 아래 사진처럼 어떤 직선 L이 있다고 하자. 그리고, 직선 L상의 벡터를 얻기 위해서 직선위의 어떤 두 점 A, P를 종점으로 하는 두 벡터 a, p가 있다고 하자. 이 경우 점 A에서 점 P로 향하는 벡터 v를 알아내기 위해 벡터의 성질 중 하나인 "벡터의 동등성" 을 이용한다.먼저, 벡터 v와 평행한 어떤 방향벡터 u를 생각해보자. 이 때, 벡터 u가 벡터 v와 동일해지는 어떤 실수 값 t가 반드시 존재한다. 따라서, 다음의 식이 성립한다. 또한, 벡터의 뺄셈을 이용하여 벡터 v = 벡터 p - 벡터 a임을 알 수 있다. 따라서, 벡터 v에 대한 두 등식을 사용하여 직선의 벡터 방정식을 ..
AABB (Axis Aligned Bounding Box) 충돌 감지 간단히 말해보자면 직각좌표계의 각 축에 정렬된 (평행한) 사각형 (Bounding Box 혹은 Collision Box) 에 대해서, 그 사각형의 최소/최대 좌표값을 이용하여 충돌을 판단한다.  먼저, x축 상에서 사각형을 형성하는 각각의 두 점의 x축 값을 이용하여 충돌이 되었는지 검사한다.이 경우 두 사각형은 좌측, 우측에서 충돌하는 (겹쳐지는) 총 두 가지 case가 생길 수 있다. 여기서 겹쳐진다는 것은 각 축에 투영된 부분이 겹치는 경우이며, 한 축당 두 가지 경우에 대한 검사를 필요로 한다.따라서, 한 축에 두 가지 경우에 대한 검사가 필요하고 아래 부등식을 모두 만족한다면 충돌했다고 할 수 있다.  그리고, 축을 하나 늘려 위와 동일한 방식으로 y축 상에서 충돌 되었는지 검사한다.  결론적으..