김서버의 프론트엔드 일기
컴퓨터 그래픽스 - 1 (수학 기초) 본문
3D나 컴퓨터 그래픽스 하면 엄청 어려운 수학을 해야한다고 생각이 될 것 인데, 우선 적어도 이번 요점 정리하는 컴퓨터그래픽스 기초 부분에서는 그렇게 어려운 수학이 필요없다.
하나씩 알아보자
행렬과 벡터
숫자들이 행과 열로 구성이 되어있는데, 프로그래밍을 공부한 사람들이라면 이미 배열이라는 이름으로 그 개념을 알게모르게 몸에 익혀있을 것이라고 가정하고 적어본다.
a11 | a12 | a13 |
a21 | a22 | a23 |
a31 | a32 | a33 |
이와 같이 행과 열의 크기가 같으면 정사각행렬이라 한다.
행렬의 곱
두 행렬 A 와 B에서 A의 크기가 l x m 이고 B의 크기가 m x n 이면, A와 B의 곱의 크기는 l x n이 된다.
a11 | a12 | b11 | b12 | b13 | |
a21 | a22 | x | b21 | b22 | b23 |
a31 | a32 |
(a11*b11) + (a12*b21) | (a11*b12) + (a12*b22) | (a11*b13) + (a12*b23) |
(a21*b11) + (a22*b21) | (a21*b12) + (a22*b22) | (a21*b13) + (a22*b23) |
(a31*b11) + (a32*b21) | (a31*b12) + (a32*b22) | (a31*b13) + (a32*b23) |
열벡터 행벡터
2차원 벡터는 (x, y), 3차원 벡터는 (x,y,z)로 표기할 수있다. 이렇게 가로로 표기를 할 경우 행벡터라고 하고,
세로로 표기할 경우 열벡터라고 한다.
전치행렬
어떤 행렬 M이 주어졌을 때, 행과 열을 바꾼 것을 전치행렬이라고 하며 M^t로 표기한다.
(OpenGL 계열은 열벡터를 사용하고, Direct3D는 행벡터를 사용한다.)
단위행렬
정사각행렬 중, 왼쪽 위 끝과 오른쪽 아래를 잇는 대각선의 원소는 모두 1이고, 나머지 원소는 모두 0인 경우를 말한다. 이는 I로 표현한다
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
단위 행렬 I와 임의 행렬 M에 대해서는 MI = IM = M이 성립한다.
역행렬
두 개의 정사각행렬 A와 B가 곱해졌을 때, 결과가 I가 된다면 B는 A의 역행렬이라고 부르며 (A^-1)이라고 표현한다.
AB와 (B^-1)(A^-1)을 곱하면 결과는 (AB)(B^-1)(A^-1) = A(BB^-1)A^-1 = AI(A^-1) = A(A^-1) = I 이다
따라서 (AB)^-1 = (B^-1)(A^-1)임을 알 수 있다.
유사하게 (AB)^T = (B^T)(A^T)이다.
정규화와 단위벡터
2차원 벡터 v의 좌표 (x,y)로 표현할 때, v의 길이는 Math.sqrt(x * x + y * y) 로 정의 되고, ||v||로 표기된다.
3차원 벡터 v의 좌표 (x,y,z)로 표현할 때의 길이는 Math.sqrt(x * x + y * y + z * z) 가 된다.
벡터 v를 ||v||로 나누는 과정을 정규화라고 하는데, v / ||v|| 는 v와 같은 방향을 가지며 길이가 1인 벡터이다. 이를 단위 벡터라고한다
기저와 선형종속
여러개의 벡터가 종속성을 가지고 있는지에 대한 식을 알수 있는 방법은 임의 스칼라값 c1 부터 cn까지 두고 각 벡터를 c1과 곱을 하여, 전부 더했을 때, 0벡터가 나오는 값이 모두가 0일 경우를 제외하고 한 개라도 있을 경우에 선형 종속적이라고 하고, 0만 채워야 가능 한 경우를 선형 독립적이라고 한다.
이때 이 벡터들은 선형 동립적일 경우 기저라고 표현 할 수 있고, 그렇지 않을 경우 기저를 표현할 수 없다.
결국 기저를 표현하는 것은 두 선이 완벽하게 겹치지 않으면 표현이 가능하다.
컴퓨터 그래픽스 기초에서는 오직 직각으로 기저를 이루는 경우만을 다루게 된다.
내적
두 개의 n차원 벡터 a, b의 내적의 식은 다음과 같이 정의 된다.
(a1*b1) + (a2*b2) + (a3*b3) ..... (an+bn)
한편 두 벡터 a와 b사이의 각도를 o로 표기하면 a * b는 기하학적으로 다음과 같이 정의 된다.
a * b = ||a|| * ||b|| * cos(o)
만약 각도가 90가 되면 a * b는 0이 된다. 예각이라면 양수가 되고, 둔각이 되면 음수가 된다.
벡터곱
두 개의 3차원 벡터 a와 b의 벡터곱(cross product)은 a X b 로 표기 되고, a와 b에 모두 수직인 또 다른 3차원 벡터이다. 방향은 오른손 법칙으로 결정된다.
|| a x b || = ||a|| * ||b|| * sin(o)
오른손에 법칙에 따르면 b X a와 a X b는 서로 반대 방향을 가진다.
직선 및 선형보간
두 개의 점 p0와 p1을 지나는 직선을 가정하고, 이 직선은 p1 - p0를 사용하여 매개변수 방정식으로 정의 된다.
p(t) = p0 + t(p1 - p0)
t는 [-무한대, 무한대] 범위에 놓이는 매개변수인데, t가 0이 되면 p(t)는 p0이고 t가 1이 되면 p(t)는 p1이 된다.
만약 t의 범위를 [0, 무한대]로 하면, p0에서 시작해서 p1 - p0 방향으로 무한하게 뻗어나가는 광선(ray)가 된다.
반면 t의 범위가 유한하게 한정된다면, p(t)는 선분을 표현한다. 예를 들어 [0,1]이라면 p(t)는 p0와 p1을 잇는 선분이 된다.
p(t) = (1 - t)p0 + tp1
위 식에서 (1 - t)와 t를 각각 p0의 가중치 p1의 가중치로 보면 p(t)는 p0와 p1의 가중치 합이 된다.
특히, t의 범위가 [0,1] 일 경우에, p(t)는 p0 와 p1의 선형 보간이라고 한다.
3차원 공간의 경우에는 다음과 같이 표현 된다.
p(t) = [x(t), y(t), z(t)] = [(1 - t)x0 + tx1, (1 - t)y0 + ty1, (1 - t)z0 + tz1]
이걸 더 직관적으로 원소를 RGB로 색상을 나타낸다고 하면
c(t) = (1 - t)c0 + tc1 = [(1 - t)R0 + tR1, (1 - t)G0 + tG1, (1 - t)B0 + tB1]
이제 여기까지 모두 따라왔으면 앞으로 컴퓨터 그래픽스를 보는 것은 큰 무리가 없다
'공부하는거 > 컴퓨터 그래픽스' 카테고리의 다른 글
컴퓨터 그래픽스 5 - 래스터라이저 (0) | 2022.11.08 |
---|---|
컴퓨터그래픽스 - 4 정점처리 (0) | 2022.09.09 |
컴퓨터그래픽스 - 3 (좌표계의 변환) (0) | 2022.09.06 |
컴퓨터 그래픽스 - 2(모델링) (0) | 2022.08.31 |