Affine Space

Affine space란 선형대수에서 벡터와 점을 표현할 때 이를 구분하기 위해 만든 개념이라고 생각하면 좋을 것 같다. 다른 내용들도 있지만, 나중에 찾아보는 걸로 했다.

Affine space는

- Scalars

- Vectors

- Points

이렇게 3가지 요소를 가지고 있다.

 일반적으로 수학에서 사용하는 좌표공간처럼 (3, 2)에서 (1, 1)로 연결된 벡터라는 식으로 표현하는 것이 아니라, 만약 (3, 2)라는 벡터가 있다면 이는 (0, 0)에서 (3, 2)로 연결된 벡터로 정의된다. 벡터는 위치를 옮겨도 같기에 항상 원점에서 시작하는 것이다. 참고로 벡터의 시작을  tail, 끝을 head라고 한다.

 벡터나 점 또한 선형대수의 벡터로 나타낼 수 있어야 한다. 이를 위해 고안된 것이 Homogeneous Coordinate이다.

다음과 같이 차원을 추가해서 점이라면 1을, 벡터라면 0을 넣는 식이다.

Linear Transformations

선형대수에 대한 지식이 있다면, Linear Transformation은 Matrix를 통해 이루어 진다는 것을 기억할 것이다.

만약 3차원 공간이고, 방금 위에서 설명한 Homogeneous Coordinate를 사용한다고 하면, 점 또는 벡터는 4차원이므로 4x4 Matrix를 사용한다면 한 점을 다른 점으로 이동시키는 Transformation이 적용될 수 있을 것이다.

그래픽스에서는 Transformation을 다음 3가지로 나누어서 분류한다. Translation, Rotation, Scaling

Translation

오브젝트를 특정 값만큼 이동시키는 것을 말한다. 모든 점을 한번에 이동시키기 때문에 회전하지 않고 그대로 움직인다.

(x’ = x + d)

3차원 공간이라면 x, y, z에 dx, dy, dz를 더하는 것을 생각해볼 수 있다. 그래서 물체는 그대로 유지된 채로 이동할 것이다.

다음과 같이 Translation Matrix를 정의할 수 있다. 만약 점을 이동시키고 싶다면 위 메트릭스와 곱하면 된다.  3번 칼럼까지는 Identity Matrix와 동일한 구조를 가지고 있기 때문에 결국 위 메트릭스는 점을 dx, dy, dz만큼 이동시키는 역할을 한다. 예시를 하나만 들어봐도 바로 직관적으로 납득할 수 있다.

Rotation

Euler Angle

 

Euler angle은 가장 쉽고 직관적으로 납득할 수 있는 회전 방법이다. x, y, z 축을 기준으로 회전이 이루어지게 된다. 일반적으로 회전을 할 때는  Right Hand Rule을 따르게 된다.

 

Euler angle의 가장 큰 문제는 Gimbal Lock 현상이다.

 

이렇게 생긴 것을 Gimbal이라고 부르는데, Euler angle을 표현할 때도 혹은 실제 계산에서도 Gimbal의 개념이 사용된다. Euler angle에서는 회전 순서가 중요하기 때문이다. x축을 기준으로 90만큼, y축을 기준으로 90만큼 회전한다고 했을때, 전자를 먼저 하느냐 후자를 먼저하느냐에 따라 결과가 달라진다. 이는 계산 복잡도를 증가시키는 요인이 되기도 하고, 위 Gimbal이 제대로 돌아갈 수 없는 상태를 만들기도 한다.

 

보통 Euler angle에서는 가장 바깥쪽 부터 z, y, x 순서대로 정의하는 경우가 많다. Unity에서도 기본으로 z, y, x 순으로 회전할 수 있도록 구현되어 있다. 근데 여기서 회전하다가 z와 y가 겹치게 되면 축 회전의 자유도가 제한된다. 이 현상을 Gimbal lock이라고 부른다.

 

Gimbal lock외에도 계산의 복잡성으로 인해 Euler angle보다는 Quaternion을 더 많이 사용하게 된다.

Gimbal Lock

Quaternion

https://eater.net/quaternions

 

Visualizing quaternions, an explorable video series

Explaining how quaternions, a four-dimensional number system, describe 3d rotation.

eater.net

직관적인 이해가 부족해서 3blue1brown 유튜브 영상과 시각 자료를 활용해서 이해해봤다.

 

Quaternion은 하나의 Real number와 3개의 허수로 이루어져 있다.

 

$a + bi + cj + kj$

 

직접 직관적으로 이해하는 것이 좋을 것이다. 위 예제를 시도해보면, 

$ q = cos(\theta ) + sin(\theta )(ai + bj + ck)$

로 로테이션을 정의할 수 있다는 것을 알 수 있다. 근데 이때 q만 적용하게 되면 물체의 크기와 위치또한 변하게 된다. 그래서 

$q^{-1}$를 추가로 곱해주게 된다. $\theta$를 두번 적용했으므로 만약 $\theta$가 45라면 실제로는 90도 회전하게 된다. 근데 어느 방향으로 회전할까? 90도를 어느 축을 기준으로 어떻게 회전하느냐 하는 의문이 생길 수 밖에 없다.

 

이는 3개의 complex number에 곱해진 값들, a, b, c에 의해 결정된다. 직관적으로 이해하기 위해서는 i를 x축, j를 y축, k를 z축으로 가정해야 한다. 또한, Quaternion을 Rotation에 사용할 때는 $a^{2} + b^{2} + c^{2} + d^{2} = 1$ 이라는 조건을 만족해야 한다. 이는 쿼터니언이 반지름이 1인 4차원 구인 초구를 가정하기 때문이다. 당연히 이는 3차원에 살고 있는 우리가 직관적으로 이해할 수는 없지만 구를 자르면 단면이 원이 되듯이, 초구를 자르면 단면이 구가 되고, 중심으로부터의 거리가 1인 점들의 집합으로 생각할 수 있다.

 

다시 돌아와서, i를 x축, j를 y축, k를 z축으로 가정하면, i가 1이고 나머지가 0이라면 x축을 기준으로 회전 - Right Hand Rule 을 적용.  j가 1이고 나머지가 0이라면 y축을 기준으로, k가 1이고 나머지가 0이라면 z축을 기준으로 회전하는 것을 확인할 수 있다.

 

직접 위 사이트에 들어가서 시도해보면 금방 감이 잡힐 것이다.

 

그래서 구체적인 식은, 점 x를 회전한 결과가 f(x)라고 할 때,

$f(x) = q * x * q^{-1}$

이 된다.

Rotation Matrix

이제 회전을 계산하는 법을 알았으니 Matrix로 표현해야 한다. 위에서 다뤘듯, 3차원 공간에서 Homogeneous Coordinate를 사용한다면 4x1 벡터로 3차원 공간에서의 벡터와 점을 표현할 수 있으므로 4 x 4 Matrix만 있으면 Linear Transformation을 표현할 수 있다.

 

먼저 Quaternion은 생각하지 않고, 어떤 벡터 혹은 점을 회전하는 Rotation Matrix를 계산한다고 하면, Roll, Pitch, Yaw 개념을 알면 편하다.

 

3차원에서 물체의 회전을 나타낼 때 사용되는 개념들이다. 지금 보면 x, y, z축이 모두 반대로 가 있다는 것을 알 수가 있다. 왜 반대로 해놨을까? 만약 x축을 기준으로 Right Hand Rule을 사용해서 회전을 한다고 하면, yz 평면안에서 회전될 것이다. 여기서 Right hand rule을 사용해서 회전한다고 하면 yz 평면을 기준으로 할 때 시계방향이 아닌 반시계 방향으로 회전하는 것을 계산해야 한다. -를 붙여서 계산할 수도 있겠지만 편의를 위해서 축들을 반대로 해 놓은 것이라고 예측할 수 있다.

 

그래서 차근차근 계산을 해 보면, 위 그림에서 Pitch를 적용하는 Matrix를 생각해보면, -x축을 기준으로 Right hand rule로 회전하는 것으로 생각할 수 있다. $\hat{j}$ 와 $\hat{k}$를 $\theta$ 만큼 회전시킨다고 생각하면 된다.

 

그래서 yaw, pitch, roll의 Matrix들을 곱해서 하나의 4x4 Matrix로 만들 수 있고, 이를 Rotation Matrix라고 한다. 유도하는 법은 어렵지 않기도 하고, 직접 찾아보면 자료가 많다.

 

그리고 Quaternion은 기존에는 Matrix가 아니라 곱셈으로 계산했었지만 결국 GPU에 데이터를 보내줄 때는 Rotation Matrix로 변환해야 하기에 Quaternion 또한 Rotation Matrix로 변환해야 한다.

 

 

Rotation Matrix는 이렇게 된다. q0는 Real number, 나머지는 Complex number이다.

 

Scaling

Scaling은 물체를 확대 축소하는 것을 말한다. x, y, z 축 방향으로만 확대축소할 수 있다고 정의한다.

 

Matrix는 간단하게,

$\begin{bmatrix}
s_{x} & 0 & 0 & 0 \\
0 & s_{y} & 0 & 0 \\
0 & 0 & 0 & 0 \\
0 & 0 & 0 s_{z} & 1 \\
\end{bmatrix}$

 

이렇게 된다. 이 Matrix를 적용하면 모든 점들이 scale factor만큼 멀어지거나 가까워 질 것이다.

 

 

Model Matrix

Translation, Rotation, Scaling에 관련한 4x4 Matrix 3개를 미리 곱해 놓은 것을 Model Matrix라고 부른다. Linear Transformation은 순서가 중요한데, Scale, Rotation, Translation 순서로 적용된다. 그럼으로 Model Matrix는

Model Matrix = TRS(x)가 되겠다. (Matrix는 오른쪽 부터 적용.)

 

View Transformation

이제 Model의 크기, 회전, 위치를 정했으니 이 모델이 카메라에 어떻게 보여질 지를 생각해야 한다.

Camera의 회전, 위치를 나타낸 Matrix를 View Matrix라고 부른다.

 

 

다음과 같이 구성되어 있으며, 위 Model Matrix를 만드는 과정에서 Rotation과 Translation의 메커니즘을 그대로 사용하게 된다. 카메라는 크기가 없으므로 Scale은 적용하지 않는다.

 

우리가 화면에서 보는 것은, 카메라가 물체를 바라보는 것과 개념적으로 동일하다. 그러므로 물체를 카메라의 입장에서 바라본다는 것을 생각해보면, View Matrix의 역행렬을 Model Matrix에 적용하게 되면, 카메라의 입장에서 바라보는 물체가 된다.

 

그래서 일반적으로 View Matrix의 역행렬을 사용하게 된다.

 

 

 

이제 Model Matrix를 적용한 후, View Matrix의 역행렬을 적용하면 카메라가 바라보는 물체를 Linear Transformation으로써 표현할 수 있다. 이 Matrix를 ModelView Matrix라고 부른다.

 

$V^{-1}TRS(x)$

 

하지만 아직 완벽하지는 않다. Orthographic, Perspective도 적용하지 않았고, 실제로 물체가 카메라의 View port 범위 안에 있는지도 알 수 없기 때문이다. 

'개인 공부 > 컴퓨터그래픽스' 카테고리의 다른 글

06 Clipping, Rasterization  (1) 2025.07.19
05. Vertex Processor  (1) 2025.07.18
03. Objects  (0) 2025.06.09
02. Camera  (1) 2025.06.07
01. Rendering Pipeline  (0) 2025.06.07

+ Recent posts