전체 글 403

[UE4] Roll, Pitch, Yaw 회전

DirectX 좌표계 Unreal 좌표계 Unreal은 DirectX와 다른 축을 갖는다. DirectX는 높이를 Y축으로 잡지만, Unreal에서는 전방이 X축, 높이가 Z축이다. 또한 왼손 좌표계를 사용한다. X축 회전 - Roll Y축 회전 - Pitch Z축 회전 - Yaw RollPitchYaw 회전은 해당하는 축에 막대를 꼽아서 돌린다고 생각하면 쉽다. x축 회전에 해당하는 Roll은 x축에 막대를 꼽고 시계방향으로 돌릴수록 회전 값이 커진다. 따라서 Object가 오른쪽으로 돌아가는 모습을 보인다. y축 회전과 z축 회전도 같은 원리로 해당 축에 막대를 꼽고 시계방향으로 돌리면 해당하는 회전 값이 커진다.

🎮Unreal4/Basic 2023.01.17

[선형대수학] 단위벡터

단위벡터(Unit Vector)는 그 크기가 정확히 1인 벡터를 말한다. 단위벡터를 표기할땐 i와 j의 점 부분을 ^으로 쓴다. 단위벡터 i (1,0)와 j (0,1)만 있다면 어떤 벡터든 만들 수 있다는 점에서 단위벡터는 굉장히 유용하게 사용된다. 어떠한 벡터 v(2,3)를 만들고 싶다면 v = 2i + 3j 와 같이 단위벡터의 덧셈과 곱셈을 이용해 만들 수 있다. [연습문제] v = (6,3) 방향의 단위벡터를 구하시오. 단위벡터의 크기는 1이기 때문에 벡터 v를 벡터의 크기로 나누어 방향은 같지만 크기는 1인 벡터를 구할 수 있다. 벡터의 크기는 길이와 같기 때문에 벡터v 의 길이를 먼저 구하고 그 후 v(6,3)를 나눈다. 따라서 벡터v의 단위벡터는 루트 45분의 6, 루트45분의 3이다. (출처..

📚수학공부 2023.01.17

[선형대수학] 벡터의 덧셈/뺄셈, 벡터와 스칼라의 곱셈

벡터의 덧셈: 벡터(x1, y1)와 (x2, y2)를 더하려면 각 벡터에 대응하는 성분 (x1+x2, y1+y2)를 더한다. 벡터 a가 (6,-2)이고, 벡터 b가 (-4, 4)라면 a+b 벡터는 (2,2)이다. 벡터 a의 머리에 벡터 b의 꼬리를 붙여 그래프에 나타내면 벡터 a의 꼬리와 벡터 b의 머리를 잇는 결과가 나온다. 반대로 더하는 순서를 바꿔 b+a 벡터를 구해도 결과는 같다. 벡터는 방향과 크기가 같다면 그래프 상 어디에 그려지든 같은 벡터이다. 벡터 a(2,1)과 스칼라 값(3)을 곱한다면 3a = 3 * (2,1)이 된다. 이후 각 벡터의 성분 2와 1에 3을 곱하면 3a = (6,3) 벡터가 된다.벡터와 스칼라의 곱셈 결과 바뀌지 않은 점은 "여전히 같은 방향을 가진다"는 점이다. 그러..

📚수학공부 2023.01.17

[선형대수학] 선형대수학의 벡터란, 실좌표공간

벡터는 크기와 방향을 동시에 나타낸다. 시속 50km로 달리는 자동차 자체는 벡터가 아닌 단순한 크기(속력)을 의미한다. 이 값은 스칼라이다. 이 자동차가 벡터가 되기위해선 방향을 가져야한다. 자동차가 동쪽으로 달린다고 하면 "동쪽으로 시속 50km를 달리는 자동차"는 속도(velocity)를 가지고, 이는 벡터가 된다. 벡터를 표기할땐 기호 위에 작은 화살표를 그린다. (5,0)으로 표기된 벡터는 수직 방향으로 5만큼, 수평방향으로 0만큼 이동한 방향벡터를 나타내고 긴 대괄호로 표현한다. R2라고 표시하는 것은 2차원 실수좌표공간을 의미한다. 2차원 실수좌표공간은 실수값을 가진 모든 2-튜플을 말한다. 튜플은 순서가 정해진 실수 2개의 순서리스트이다. 따라서 R3는 3차원 실수좌표공간이 된다. 즉, 순..

📚수학공부 2023.01.17

[C++] 가변배열(동적할당 활용)

가변 배열의 구현 이전 시간에 공부한 동적 할당 개념을 활용하여 'int형 가변 배열'을 직접 구현해보았다. - Arr.h 헤더 파일 및 Arr.cpp 파일 생성 Arr.h 헤더 파일의 생성 가변 배열의 필수 구조체 멤버 // int형 가변배열 typedef struct _tabArr { // 필수 멤버 3가지 int* pInt; int iCount; int iMaxCount; }tArr; 가변 배열을 구현하기 위해 헤더 파일에 구조체를 생성하였다. 구조체 필수 멤버로는 배열을 저장할 포인터 변수(pInt), 현재 배열의 요소 수를 확인할 변수(iCount), 배열의 최대 크기 변수(iMaxCount)까지 3가지가 필요하다. 가변 배열 필수 함수 // 배열 초기화 함수 void InitArr(tArr* ..

📚책읽기 2022.04.04

[C++] 동적할당(malloc)

동적 할당 동적 할당은 프로그램 실행 도중에(런타임 중) 사용자가 원하는 만큼 메모리를 요청할 수 있도록 한다. 이때 사용하는 메모리 영역은 스택/데이터/ROM/힙 영역 중 힙(Heap) 메모리 영역이다. 동적 할당은 원하는 메모리 크기를 힙 메모리 영역에서 할당하고 할당된 첫 번째 주소를 받아와서 어떤 목적으로 사용할지 포인터 캐스팅을 하면 된다. // 1. 힙 영역에 100 byte 만큼의 메모리를 할당 // 2. 할당된 시작 주소를 pInt 포인터 변수에 저장 int* pInt = (int*)malloc(100); (int*)와 같이 강제 포인터 캐스팅을 한 이유 malloc(memory allocator)은 반환 타입이 void 포인터의 함수이다. void 포인터는 주소만을 저장하기 위한 목적으로..

📚책읽기 2022.04.04

[C++] 문자열 함수(wcslen, wcscat_s, wcscmp), 함수 구현 과제

문자열의 길이 판별 함수 wcslen(const wchar_t* _String); 문자열의 길이를 판별할 때 해당 문자열을 변형시키면 안 되기 때문에 const wchar_t*를 통해 제한을 걸어준다. 직접 구현 /* 문자열의 길이 체크 함수 (wcslen 구현) */ unsigned int GetLength(const wchar_t* _pStr) { // 문자 개수 체크 용도 int i = 0; while ('\0' != _pStr[i]) { ++i; } return i; } 문자열 이어 붙이는 함수 wcscat_s(wchar_t* _pDest, unsigned int _iBufferSize, const wchar_t* _pSrc); - 매개변수는 "이어 붙어질 문자열(_pDest)", "이어 붙어질 ..

📚책읽기 2022.03.13

[C++] 문자, 문자열(char, wchar_t, const wchar_t*)

문자 wchar_t wc = 65; // 아스키코드 값 : A short s = 65; // 메모리 상에서 상수 1과 문자 '1'은 다르게 판별된다. char c = 1; // 숫자 그대로 '\x1'로 해석 char c = '1'; // 아스키코드 값 49로 해석 wchar_t wc = 459; // 459를 숫자로 저장하면 459의 2진수 값이 저장된다. wchar_t wc = '459'; // 459를 문자로 저장하면 '4','5','6'의 각 아스키코드 값이 저장된다. 문자열 많이 쓰이는 문자열 타입은 char 과 wchar_t 가 있다. char ch = 'a'; wchar_t wct = L'a'; char 자료형은 '멀티 바이트' 문자열로써 1byte와 2byte가 동시에 사용된다. (이로 인해..

📚책읽기 2022.03.09

[C/C++] const 포인터, void 포인터

const 상수화 : 숫자가 변하지 않음 l-value : 변수 r-value : 상수 const라는 키워드는 변수를 '상수화' 시켜주는 역할을 수행한다. 하지만 일반적으로 사용하는 진짜 상수(10, 20,...)처럼 변화하는 것은 아니다. 문법적으로 상수화를 지켜주는 것이지 진짜 상수는 아니다. const와 포인터 포인터의 두 가지 상황(역할) 1. 포인터 자체가 가리킬 변수의 주소를 변경할 수 있다. 2. 포인터가 가리킨 변수의 값을 변경할 수 있다. const - 포인터 const 포인터는 "포인터가 가리키는 원본 변수가 상수화 된 것" 이다. int a = 0; int b = 0; const int* pConstInt = &a; pConstInt = &b; // 가능 *pConstInt = 100..

📚책읽기 2022.03.09

[C/C++] 포인터 이해 확인 문제

문제 1. short sArr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* pI = (int*)sArr; int iData = *((short*)(pI + 2)); printf("1번 문제 정답 : %d\n", iData); 문제 풀이 short 배열은 2byte 단위로 이루어져 있다. pI는 int형 포인터이기 때문에 4byte 단위로 해석하게 된다. 이후 pI에 +2를 했기 때문에 주소는 4byte씩 2번 해석되어 8byte가 넘어가게 된다. [0]=1 (2byte) / [1]=2 (2byte) / [2]=3 (2byte) / [3]=4 (2byte) / [4]=5 (2byte) / [5]=6 (2byte) / ... 위와 같은 배열의 메모리 구조에서 8byte가 넘어가면 [4]..

📚책읽기 2022.03.07

[C/C++] 포인터 변수, 포인터 배열

포인터 변수 포인터 변수란 주소를 저장하는 변수로써 형태로 작성된다. 포인터 변수에서 자료형은 해당 포인터에게 전달된 주소를 해석하는 단위로써 사용된다. int i = 100; int* pInt = &i; 위의 포인터 변수는 변수 i의 주소를 저장하며 int형이므로 4바이트 단위로 주소를 해석하게 된다. 포인터의 해석 주소는 정수 표현이기 때문에 bit단위로 표현될 수 없어 Byte 단위로만 해석된다. 포인터 변수는 "이미 답이 정해진 변수"이다. 포인터 변수를 int*로 선언하였으면 해당 주소의 데이터는 int형이어야만 한다. 만약 자료형이 float인 경우도 4byte 단위이고, int인 경우도 4byte 단위로 같은 경우, float을 int형 포인터 배열(int*)에 저장하게 된다면 어떤 문제점이..

📚책읽기 2022.03.07
728x90