김서버의 프론트엔드 일기

컴퓨터 그래픽스 - 1 (수학 기초) 본문

공부하는거/컴퓨터 그래픽스

컴퓨터 그래픽스 - 1 (수학 기초)

kimSerVer 2022. 8. 24. 22:59

 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]

 

 

 

 

 이제 여기까지 모두 따라왔으면 앞으로 컴퓨터 그래픽스를 보는 것은 큰 무리가 없다