본문 바로가기

전체 글126

Joystick으로 8방향 이동과 Blend Tree Animation 구현 목표 1. Joystick으로 Player가 움직일 Vector2 만들기 2. Joystick의 Vector2를 이용하여 8방향 이동과 Blend Tree로 Animation 구현 1. Joystick Joystick은 구현을 해보았기에 구현에 어려움은 없었다. 중요한 건 Joystick으로 만든 Vector2의 범위를 -1 ~ 1 로 만드는 것. 이유는 Blend Tree에서 Horizontal 과 Vertical 로 사용하기 때문. (Horizontal과 Vertical도 -1 ~ 1) 임시 그림으로 Joystick을 그려서 나중에 제대로 그릴 때 크기가 바뀔 수 있으니, 바뀌는 크기에 대해 대응하도록 구현해야했음. 2. Blend Tree Blend Tree 로 8방향 Animation과 Idle을.. 2021. 3. 2.
3D에서 2D Sprite Depth 처리 1. 문제점 이 게임은 3D World에서 2D처럼 보이는 View를 가진다. 그런데 위와 같이 캐릭터가 움직이면 카메라가 갑자기 못 그려주게 되었다. 모든 2D Sprite가 마찬가지였다. 2. 원인 Unity는 기본적으로 렌더링할 때, Sprite 단위로 렌더링을 한다. 즉, Camera와 Sprite의 거리를 측정해서, 가까운 Sprite를 앞에 그려준다는 것이다. 나한테 생긴 문제에 적용시켜보면 Camera와 Ground의 거리 와 Camera와 Player의 거리를 비교하여, 거리가 짧은 Sprite를 그려주는 것이다. 그래서 정확히는 Camera와 Ground가 Camera와 Player의 거리보다 가까워질 때, Player가 Ground의 뒤에 보여지는 것이다. (결국 Ground가 커서 P.. 2021. 3. 1.
Aliasing과 Anti-Aliasing Aliasing과 Anti-Aliasing Aliasing 아날로그의 원본을 컴퓨터가 저장하면서 원본이 손상되는 현상이다. Sampling rate가 낮아서 생기는 모든 문제라고도 말할 수 있다. 한국말로 계단현상이라고도 한다. 이런 선이 있다면, 이 선을 한칸한칸(한 pixel)에 찍어주면서 계단처럼 보이게 된다. 이런 식으로 부자연스럽게 보이게 된다. Polygon Aliasing Scan line에 걸치지 않을 정도로 작은 polygon이 있다면, 컴퓨터가 읽지 못해 색을 칠해주지 못한다. 그래서 우리 눈에 사라진 것처럼 보인다. Anti-Aliasing Aliasing을 줄이는 방법이 Anti-Aliasing이다. sampling rate가 낮아서 생기는 문제이니 높여주면 된다. 단순히 sampl.. 2021. 2. 3.
Rasterization Rasterization Rasterization Primitive Assembly 과정에서 Primitive을 그리는데, 이 때 어떤 pixel이 Primitive에 속하는지 계산하는 것. (OpenGL 에서는 이 과정을 알아서 해준다) 그래서 pixel에 들어가는 Fragment의 list를 뽑아낼 수 있다. Line Algorithm 그렇다면 Line에 속해있는 pixel들은 어떻게 계산되어질까? Line을 Rasterization하는 알고리즘이 존재한다. 1. DDA Algorithm x가 1만큼 변할 때마다 y는 m만큼 변화시켜준다. 그러면 x는 정수단위이고, y는 부동소수점단위이기 때문에 반올림 시켜준다. 이를 수도코드로 표현하면 다음과 같다. for(ix = x1; ix 아래 pixel 로... 2021. 1. 31.
Perspective Projection Perspective Projection Perspective Projection 원근법으로 멀리 있는 건 작게, 가까이 있는 건 크게 그리는 방법이다. Projection Matrix 만약 z의 위치에 어떤 물체가 있고, 이를 View plane에 크기에 맞춰 그리려면 닮은 비를 이용하자. 이를 x', y', z' 으로 풀어보면 이를 행렬로 표현하면 다음과 같다. 한 예시인데, 이같은 행렬 형태로 쓰인다는 것만 알고 있자. Frustum View Volume -> Normalized View Volume Normalized Coordinates를 사용하기 위해 우선 Znear Plane과 Zfar Plane을 두고, Znear 와 Zfar를 -1 과 1 로 만들어줘야 한다. Z 를 -1~1 로 만들어주.. 2021. 1. 18.
Camera Coordinates Camera Coordinates 좌표계는 어떤 게 있을까? 1. Modeling Coordinates Modeling 하는 좌표계 실세계와 다른 독립된 좌표계이다. 2. World Coordinates 실세계의 좌표계 Modeling 된 물체들이 World Coordinates에 배치된다. 3. Camera Coordinates 카메라로 보는 좌표계 유저가 바라보게 되는 좌표계이다. 이 때 Camera Coordinates 는 어떻게 구성될까? Camera Coordinates Camera 는 그 자리에 있고, 그 위치에 대한 상대적인 위치를 정의하면 된다. 그림으로 살펴보자. World Coordinates가 있고, Camera Coordinates가 있다고 하자. 이 때 World Coordinat.. 2021. 1. 17.
GPU와 Buffer GPU와 Buffer Buffer Video Memory에 data를 저장하기 위한 공간 (하드웨어 저장공간) Vertex Buffer Objects (VBO) Vertex 특성인 Attributes를 담을 수 있는 buffer. Vertex의 position 이나 Texture Coordinates 등이 있다. OpenGL 입장에서는 position 하나가 buffer 하나라고 생각하면 된다. Vertex Array (VA) Vertex의 Attributes 가 여러개, 즉 buffer가 여러개 존재한다. 각각의 buffer가 무엇인지 알기 위해서 번호를 다는 것. 즉 Array에 담은 것이다. Vertex Buffer Objects GPU로 보낼 Vertex 의 position 배열이 있다고 하자. .. 2021. 1. 17.
GPU에 data를 전달하기 GPU에 data를 전달하기 옛날 방식 CPU에서 RAM에 있는 data를 읽고 매 프레임마다 GPU로 전달하는 방식이었다. 그런데 이는 전달하지 않아도 될 때에도 data를 전달하게 되는 큰 낭비가 발생하게 된다. 현재 방식 GPU한테 data를 다 보내놓고 필요할 때마다 그리라고 신호를 주는 방식이다. GPU는 data를 Video Memory에 저장한 상태에서, CPU에서 그리라는 신호가 오면 Video Memory에서 data를 가져와서 연산하는 방식이다. 그리고 GPU의 bus는 PCIE 라는 것을 사용한다. 이는 그래픽 카드에서 주로 사용하는데 그만큼 전송할 데이터 양이 많아서 그렇다. 또 Video Memory는 DDR5 를 사용한다. (현재 노트북 RAM 사양을 보면 아마 DDR4가 제일 .. 2021. 1. 17.
[ 컴퓨터구조 ] Cache Cache 순서 1. Cache 설명, 용어 2. Cache 구성 3. Indexing 4. Block offset 5. Tag 6. Tag matching + Write-back, Write-through Cache 란? Memory에 접근하는 것은 느리다. Processor가 연산하는 것이 훨씬 빠르다. 그래서 Memory에서 data를 읽고 쓰기 위해 access하는 성능이 느려서, 그동안 Processor는 놀고 있게 된다. Processor는 비싼 장비이니 최대한 써먹어야 한다. 따라서 자주 사용하는 데이터는 Memory까지 가지 말고 Processor 안에 미리 가져옴(Prefetching)와서 사용함으로써 Processor가 계속 바쁘게 돌아갈 수 있게 만드는 기술이다. 즉, Memory에 .. 2020. 12. 9.
[ 3D Rotation ] 임의의 축으로 회전하기 임의의 축으로 회전하기 3D 환경에서 x축, y축, z축으로 회전하는 건 4X4 matrix로 할 수 있다. 그러면 임의의 축으로 회전하는 건 어떻게 할까? 순서 1. 임의의 축이 좌표축과 평행할 때 (Special Case) 회전 2. 좌표축과 평행하지 않은 임의의 축 회전 - 5 Step이 있음 - α와 β를 구하는 법 - 다른 형태의 matrix 임의의 축이 좌표축과 평행할 때 (Special Case) 임의의 축이 x과 평행하다고 해보자. 이럴 때 회전은 어떻게 될까? 다음과 같이 진행된다. 1. 임의의 축을 x축으로 이동 2. x축 기준으로 회전 3. 임의의 축을 원래 자리로 이동 1. 임의의 축을 x축으로 이동 2. x축 기준으로 회전 3. 임의의 축을 원래 자리로 이동 회전하는 점의 식은 이.. 2020. 12. 4.
3D Geometric Transformation 3D Geometric Transformation Homogenous Coordinates in 3D 2D에서 변환 matrix가 3X3 matrix로 표현됐다면, 3D에서 변환 matrix는 4X4 matrix로 표현된다. 3D Translation 3D에서의 Translation matrix는 위와 같이 4X4 matrix로 표현할 수 있다. Inverse matrix는 이와 같이 표현된다. 3D Rotation 2D에서는 각도 하나로 Rotation이 가능했다. 회전하는 방향이 하나이다. 그런데 3D에서는?? 세 방향으로 회전이 가능하다. (Yaw, Roll, Pitch) 그래서 rotation의 축이 결정되어야 한다. x축 기준, y축 기준, z축 기준, 임의의 축 기준으로 회전할 수 있다. 우선.. 2020. 12. 4.
Homogeneous Coordinate Homogeneous Coordinate 이전 글 2D Geometric Transformation에 이어서. Homogeneous Coordinates (x,y) 라는 2D 좌표를 확장하여 (x,y,1) 으로 표현하는 것이다. 즉, 2D 좌표계를 3X3 matrix로 확장한 것이다. (만약 3D 좌표계라면, 4 X 4 matrix가 된다.) Homogeneous Coordinates의 특징 - (x, y, h) 일 때, h=1 일 때 augmented vector라고 부름. - 원점 : (0, 0, 1) - (x, y, 0) : 0을 곱해도 x, y가 남아있을 정도면 엄청 크므로, 숫자가 무한대였을 것이라 생각. - (0, 0, 0) : Homogeneous Coordinates에서는 존재하지 않음. .. 2020. 12. 4.
2D Geometric Transformation 2D Geometric Transformation 순서 1. 2D Translation matrix 2. 2D Rotation matrix 3. 2D Scaling matirx 4. 실제 사용하는 matrix일까? Transformation 만들어진 기하학적 물체의 위치를 바꾸거나, 방향을 바꾸거나, 종횡비를 바꾸거나, 크기를 바꾸거나 이런 변환 작업을 Geometric Transformation이라고 한다. 결국엔, 물체를 어디선가 만들었는데, 디스플레이 화면 상에 어디에 보여야할지의 문제라고 생각하면 된다. 우리 화면 상에 실제로 어디에 배치되어야 하냐는 것이다. Transformation의 하나의 예시 Maya, 3D Max, Blender 등에서 어떤 물체를 만들었는데, 이것을 Unity, Unr.. 2020. 12. 4.
[ C++ ] 8bits string을 unsigned char로 file에 압축하여 저장하기 8bits string을 unsigned char로 file에 압축하여 저장하기 목표 string 형태인 8bits binary 를 file에 1byte 크기로 넣기 즉, string을 unsigned char로 변환하는 작업을 수행할 것이다. 문제점 이진수를 binary 파일을 열어 입력해보았다. 결과는 string 형태인 8bits 이진수를 file에 쓰면 8개의 char가 쓰이게 된다. 이는 8byte 크기로 저장되는 것이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include #include using namespace std; void encoder(const string& txt) { ofstream fout; fout.open("encodingTe.. 2020. 11. 15.
정렬 - 가장 큰 수 정렬 - 가장 큰 수 문제 출저 - 프로그래머스 programmers.co.kr/learn/courses/30/lessons/42746 Answer code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include #include #include using namespace std; bool cmp(int a, int b){ string str1 = to_string(a) + to_string(b); string str2 = to_string(b) + to_string(a); return str1 > str2; } string solution(vector numbers) { string answer = ""; sort(numbe.. 2020. 11. 15.