공부/컴퓨터 그래픽스

OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문 Chapter 02 수학 기초

bokob 2024. 6. 26. 00:10

2.1 행렬과 벡터(Matrices and Vectors)

행렬(matrix)

행(row)과 열(column)로 구성, m개의 행과 n개의 열을 가진 행렬은 다음과 같이 표현

 

행렬의 크기는 m x n 으로 표기, m과 n이 같다면 정사각행렬(square matrix)이라 한다.

행렬 각 원소의 아래첨자는 그 원소의 위치를 말한다.

 

행렬 곱셈

A의 크기가 l x m 이고, B의 크기가 m x n 이라면, AB의 크기는 l x n 이 된다.

 

백터

행벡터

2차원 벡터는 (x, y), 3차원 벡터는 (x, y, z)로 표기

 

열백터

 

행렬-벡터 곱셈

 

전치행렬(transpose)

$M^T$로 표기

위의 행렬 M의 전치행렬은 다음과 같다.

\begin{pmatrix} a & c & e \\ b & d & f \end{pmatrix}

이는 벡터에도 그대로 적용된다. 열벡터 $v$의 원소를 행벡터로 표현하면 $v^T$가 된다.

행렬-벡터 곱셈은 다른 방식으로 표현될 수 있다. 열벡터 $v$ 대신 행백터 $v^T$를 사용하고, $M^T$의 왼쪽에 배치한다.

아래 수식은 위의 $Mv$에 $(AB)^T = B^TA^T$를 적용한 것과 같다.

OpenGL은 열벡터를 사용하고 행렬-벡터 곱셈에서 행렬의 오른쪽에 벡터를 위치시키고, Direct3D는 행벡터를 사용하고 행렬-벡터 곱셈에서 행렬의 왼쪽에 벡터를 위치시킨다.

 

단위 행렬(identity matrix)

정사각행렬 중, 왼쪽 위 끝과 오른쪽 아래를 잇는 대각 원소 모두 1이고 나머지 원소는 모두 0인 경우다.

$I$로 표기한다.

 

임의의 행렬 &M&에 대해서 다음과 같이 $MI=IM=M$이 성립한다.

역행렬(Inverse)

두 개의 정사각행렬 $A$와 $B$가 곱해져서 그 결과가 $I$가 된다면, 즉 $AB=I$ 라면, $B$는 $A$의 역행렬이라 부르고 $A^{-1}$로 표기

$(AB)^{-1} = B^{-1}A^{-1}$

 

정규화(normalization)

2차원 벡터 $v$의 좌표를 $(v_x, v_y)$로 표현할 때, $v$의 길이는 $\sqrt{{v_x}^2+ {v_y}^2 }$으로 정의되고 $\left\|v\right\|$로 표기

3차원 벡터 $v$의 좌표를 $(v_x, v_y, v_z)$의 길이는 $\sqrt{{v_x}^2+ {v_y}^2+{v_z}^2 }$이 된다.

벡터 $v$를 그 길이 $\left\|v\right\|$로 나누는 과정을 정규화라고 한다.

 

단위 벡터(unit vector)

$\frac{ v }{ \left\|v\right\| }$는 $v$와 같은 방향을 가지며 길이가 1인 벡터이다. 이를 단위 벡터라 한다.

 

 

2.2 좌표계와 기저(Coordinate System and Basis)

좌표계 = 원점 + 기저

직교정규기저는 단위 벡터들의 직교 집합이다.

2차원 좌표계에서 모든 벡터는 기저 벡터의 선형 조합으로 정의될 수 있다.

${e_1, e_2}$를 기저(basis)라고 부르는데, 주축(principal axis)에 나란하므로 특별히 표준 기저(standard basis)라고 한다.

서로 직교하는 단위 벡터이므로 직교정규(orthonormal) 성질을 가진다고 한다.

표준 기저 말고도 다양한 기저를 사용할 수 있다. 위 그림 중 우측에 해당한다.

 

2.3 내적(Dot Product)

두 개의 n차원 벡터 a와 b를 각각 (a_1, a_2, \cdots, a_n)과 (a_1, a_2, \cdots, a_n)으로 표현된다면, a와 b의 내적(inner product 또는 dot product)은 $a \cdot b$ 로 표기되고 다음과 같이 정의된다.

$ a \cdot b = \sum_{i=1}^{n}a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n $

두 벡터 $a$와 $b$ 사이의 각도를 θ로 표기하면 $ a \cdot b $는 기하학적으로 다음과 같이 정의

$a\cdot b=||a||||b||\cos{\theta}$

  • a와 b가 서로 수직이면 θ가 $90^\circ$가 되어 $a \cdot b$는 0
  • θ가 예각이면 $a \cdot b$는 양수
  • θ가 둔각이면 $a \cdot b$는 음수

하나의 단위 벡터를 자기 자신과 내적하면 1이 된다.

서로 수직인 벡터의 내적은 0이다.

하나의 직교정규 기저가 있을 때, 동일한 기저 벡터 간 내적은 1이고, 다른 기저 벡터 간 내적은 0이다.

이는 모든 직교정규 기저가 가지는 성질이다.

2.4 벡터곱(Cross Product)

벡터곱은 3차원에서만 정의되는 연산이다.

두 개의 3차원 벡터 a와 b의 벡터곱(cross product)은 $a \times b$로 표기

이는 a와 b에 모두 수직인 또 다른 3차원 벡터이다.

벡터곱 $a \times b$은 오른손 법칙(right-hand rule)으로 결정된다. 오른손 네 손가락이 첫 번째 벡터 a에서 두 번째 벡터 b쪽으로 감싸며 움직일 때 엄지손가락이 $a \times b$의 방향을 가리키게 된다.

$a \times b$의 길이는 a와 b에 읳해 만들어지는 평행사변형의 넓이와 같다.

$||a\times b||=||a||||b||\sin{\theta}$

$b \times a$와 $a \times b$는 서로 반대 방향을 가진다. $b \times a = -(a \times b)$가 된다. 이런 점에서 벡터곱을 반가환적이라 부른다. 물론 두 길이는 같다.

 

2.5 직선 및 선형보간(Linear Interpolation)

두 개의 점 $p_0$와 $p_1$을 지나는 직선을 생각해보면, $p_0$, $p_0$와 $p_1$을 잇는 벡터인 $p_1 - p_0$를 사용하여 다음과 같은 매개변수 방정식(parametric equation)으로 정의된다.

$p(t) = p_0 + t(p_1-p_0)$

t가 [-∞, ∞] 범위면 양쪽으로 무한히 뻗는 직선을 표현

t가 [0, ] 범위면 $p_0$에서 $p_1-p_0$ 방향으로 무한하게 뻗는 광선(ray)이 된다.

t의 범위가 유한하게 한정되면 선분을 표현

 

수식을 다시 쓰면

$p(t) = (1-t)p_0 + tp_1$

(1-t)와 t를 각각 $p_0$와 $p_1$에 대한 가중치(weight)로 보면, $p(t)$는 $p_0$와 $p_1$의 가중치 합(weighted sum)이 된다. 특히 t의 범위가 [0, 1]일 때, $p(t)$는 $p_0$와 $p_1$의 선형보간(linear interpolation)이라고 한다.

 

2차원, 3차원에서는 선형보간을 이용해 각각 다음과 같은 $p(t)$의 좌표를 얻는다.

$p_0$와 $p_1$에 특정한 값이 저장되어 있다면, 그 값들도 선형보간될 수 있다.

 

예를 들어 $p_0$에  $c_0$라는 색상이 저장되어 있고 그 원소를 $(R_0, G_0, B_0)$라 하자. 마찬가지로 $p_1$에 $c_1$이라는 색상이 지정되어 있고 그 원소를 $(R_1, G_1, B_1)$이라 하자.

선형 보간된 색상은 다음과 같이 정의할 수 있다.

 

출처

[OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]을 보고 공부하고 정리한 내용