DirectX

DirectX3D) 9. 아핀변환

minkg3532 2026. 5. 10. 23:36

아핀변환(affine transformation)은 선형변환에 이동(translation)이 결합된 것이다.

벡터는 위치와 무관하게 오직 방향과 크기만 서술하는 특징이 존재하여, 벡터만 놓고 봤을때 이동이라는 개념은 의미가 없는 행위이다. 벡터는 결국 이동에 대해 불변이어야 하며, 이동(위치벡터)은 오직 점에만 적용되어야 한다.

 

이를 위해서 동차좌표(homogeneous coordinate)라는 것을 이용하면 점과 벡터를 동일한 방식으로 다룰 수 있다. 동차좌표는 3차원 벡터에 $w$ 성분을 추가한 4원소쌍의 형태인데, 이 $w$의 값은 서술하는 것이 점이냐 벡터이냐에 따라 달라진다. 

  1. 벡터의 경우 $(x,y,z,0)$
  2. 점의 경우 $(x,y,z,1)$

점에 대해서는 $w=1$로 설정하면 이동 시 점이 정확히 이동되며, 벡터에 대해서는 $w=0$으로 설정하면 이동 시 벡터가 변하지 않는다. 

 

정의 및 행렬 표현

 

3차원 그래픽에 필요한 변환들 중에는 선형변환으로는 서술하지 못하는 것도 있다.

그래서 아핀변환을 이용해서 이 문제를 해결한다. 아핀변환은 선형변환에 이동 벡터 $b$를 더한 것이다.

 

$$\alpha(u) = \tau(u) + b$$

 

이를 행렬로 표기하면 다음과 같다.

 

$$\alpha(\mathbf{u}) = \mathbf{u} \mathbf{A} + \mathbf{b} = [x, \ y, \ z] \begin{bmatrix} A_{11} & A_{12} & A_{13} \\ A_{21} & A_{22} & A_{23} \\ A_{31} & A_{32} & A_{33} \end{bmatrix} + [b_x, \ b_y, \ b_z] = [x', \ y', \ z']$$

 

여기서 A는 선형변환의 행렬 표현식이며, $w=1$인 동차좌표를 도입하면 이를 아래와 같이 간결하게 표현할 수 있다.

 

$$[x, \ y, \ z, \ 1] \begin{bmatrix} A_{11} & A_{12} & A_{13} & 0 \\ A_{21} & A_{22} & A_{23} & 0 \\ A_{31} & A_{32} & A_{33} & 0 \\ b_x & b_y & b_z & 1 \end{bmatrix} = [x', \ y', \ z', \ 1]$$
 
$w=1$을 추가하여 선형 변환과 이동을 하나의 $4 \times 4$ 행렬로 표현한 식이다. 이 식을 $4 \times 4$ 행렬을 아핀변환의 행렬 표현이라고 부른다.
 여기서 $b$는 본질적으로 하나의 이동(위치의 변화)을 나타낸다. 벡터에는 위치가 없으므로, 벡터에 대해서는 이 이동이 적용되지 말아야 한다. 그러나 아핀변환의 선형변환 부분은 여전히 벡터에 적용되어야 한다. 벡터의 동차좌표의 넷째 성분을 0으로, 즉 $w=0$으로 설정하면 b에 의한 이동은 적용되지 않는다.

 

 

이동(Translation)

주어진 인수(입력)를 그대로 돌려주는 선형변환, 즉 $I(u) = u$를 항등(단위) 변환(identity transformation)이라고 부른다. 이 선형변환의 행렬 표현이 단위행렬임을 증명할 수 있다. (항등변환은 어떤 벡터를 넣어도 크기가 변하거나 회전하지 않고 자기자신인 $u$이 그대로 나오는 변환이다)

 

이러한 맥락에서, 이동 변환을 선형변환 부분이 하나의 단위행렬인 아핀변환이라고 정의할 수 있다. 이는 오로지 이동만 한다고 가정했을 때이다.

 

$$\tau(u) = uI + b = u + b$$

 

이 변환은 점 $u$를 $b$만큼 이동한다. 물체의 모든 점의 위치를 동일한 벡터 $b$로 변경하면 물체 전체가 그만큼 이동할 수 있다는 것이다.

 

해당 위의 식에 의해 $\tau$의 행렬 표현은 다음과 같다.

 

$$\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ b_x & b_y & b_z & 1 \end{bmatrix}$$

 

이를 이동행렬이라고 한다.

 

$$ \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -b_x & -b_y & -b_z & 1 \end{bmatrix}$$
 
이는 이동행렬의 역이다.

 

그럼 여기서 비례(Scale)과 회전(Rotation)을 위한 아편변환 행렬에 대해서 알아보자.
만일 $b$가 0이라면 아핀변환은 그냥 일반 선형변환이 된다. 따라서 $b=0$으로 둠으로써 임의의 선형변환을 아핀변환으로 표현할 수 있다. 이는 임의의 선형변환을 다음과 같이 $4 \times 4$ 아핀변환 행렬(아핀 행렬)로 표기할 수 있다.

 

$$\mathbf{S} = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}$$
$$\mathbf{R_n} = \begin{bmatrix} c+(1-c)x^2 & (1-c)xy+sz & (1-c)xz-sy & 0 \\ (1-c)xy-sz & c+(1-c)y^2 & (1-c)yz+sx & 0 \\ (1-c)xz+sy & (1-c)yz-sx & c+(1-c)z^2 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}$$
이렇게 되면 일관되게 $4 \times 4$ 행렬로 나타낼 수 있으며, 점과 벡터를 $1 \times 4$ 동차 행벡터( $uA$ )로 나타낼 수 있다.

 

 

'DirectX' 카테고리의 다른 글

DirectX3D) 8. 선형변환  (0) 2026.05.10
DirectX3D) 7. 행렬식  (0) 2026.05.10
DirectX3D) 6. 행렬의 활용(SRT)  (0) 2026.05.09
DirectX3D) 5. 행렬  (0) 2026.05.05
DirectX3D) 4. Point  (0) 2026.04.30