본문으로 바로가기

월드 변환 ( World Transformation )

category Graphics/이론 2022. 10. 23. 20:19

이 글을 읽는 사람이 기초 개념을 알고있다고 가정합니다. ( 선형성, 행렬 등 )

 

월드 변환이란?

월드 변환은 모델의 로컬 원점을 기준으로 Vertex가 정의된 모델 공간에서 모든 개체에 공통된 원점을 기준으로 정의되는 World Space로 좌표를 변경하는 것이다.

 

월드 변환에는 좌표 이동, 회전 및 크기 조정이 포함될 수 있다.

 

월드 변환을 알기 전에 '좌표 이동', '회전', '크기' 조정에 대해 알아야 한다.

 

이동 변환

말 그대로 어떠한 Vertex를 특정 크기만큼 이동시키는 변환을 의미한다.

이동 변환을 수식으로 표현하면 다음과 같다.

$$\begin{cases}x' = x + a\\y' = y + b\\z' = z + c \end{cases}$$

(x, y) 에 (a, b)를 더하여 (x', y') 로 변환한다.

이동 행렬은 다음과 같다.

$$ \begin{bmatrix}x & y\\ \end{bmatrix} +
\begin{bmatrix} a & b\\ \end{bmatrix} =
\begin{bmatrix}x + a \\y + b \end{bmatrix} $$

 

(회전, 크기 변환에 대해 설명한 후 자세히 다룰거니 일단 이것만 알아두자)

 

회전 변환 

회전 변환은 특정 '점' 을 좌표내에서 각도만큼 회전시켜주는 변환이다.

일단 이에 대해 유도를 해보자.

 

 

P(x, y) 가 P' (x', y')로 $$\Theta $$ 만큼 회전했다고 생각해보자.

일단 P의 x, y를 계산해보자

$$\frac{x}{r} = cos\alpha$$ 이고

$$\frac{y}{r} = sin\alpha$$ 이므로

 

$$x = rcos\alpha$$

$$y = rsin\alpha$$ 이다.

 

그럼 P'(x', y')는 $$\alpha$$에 $$\theta$$ 를 더 한 것이므로

 

$$x' = rcos(\alpha + \theta)$$

$$y' = rsin(\alpha + \theta)$$ 이다.

 

이걸 삼각함수 합차공식으로 정리하면 

 

$$x' = rcos\alpha\cos\theta\ - rsin\alpha\sin\theta$$

$$y' = rsin\alpha\cos\theta\ + rcos\alpha\sin\theta$$ 이다.

 

$$x = rcos\alpha$$

$$y = rsin\alpha$$ 이므로 치환하면

 

$$x' = xcos\theta\ - ysin\theta$$

$$y' = ycos\theta\ + xsin\theta$$ 이다.

 

이를 행렬로 정리하면

$$\begin{bmatrix}x & y  \end{bmatrix}
\begin{bmatrix}cos\theta & sin\theta \\-sin\theta & cos\theta \end{bmatrix}$$

이고 이것이 곧 회전 변환 행렬이다..

 

크기 변환

크기 변환은 물체의 크기를 변경하는 변환이다.

크기 변환은 각 표준기저벡터를 동일한 방향으로 지정한 크기만큼 늘리는 변환을 의미한다.

이를 위해 (1, 0) 좌표를 갖는 e1 과 (0, 1) 좌표를 갖는 e2 표준기저벡터를 생각해보자.

 

표준기저벡터 e1을 a배 늘리거나 줄인 벡터 = $$a \cdot(1, 0) = (a, 0)$$

표준기저벡터 e2를 a배 늘리거나 줄인 벡터 = $$b \cdot(0, 1) = (0, b)$$

 

e1을 a배 만큼 늘리고, e2를 b배만큼 줄인 선형 변환으로 인한 벡터의 좌표는 다음과 같다.

 

 

그렇다면 변환된 두 표준기저벡터 (a, 0)과 (0, b)를 행벡터로 설정해 생성한 크기 변환행렬은 다음과 같다.

$$S = \begin{bmatrix}a & 0 \\0 & d \end{bmatrix}$$

 

전단 행렬

위의 월드 변환과는 상관 없지만, 앞으로의 설명을 위해 작성한다.

표준 기저 벡터 e1, e2가 있을 때 e2를 x축 방향으로 미는 변환을 생각해보자

e1은 고정되어 있기 때문에, 변환된 결과는 

다음과 같이 될 것이다.

 

표준기저벡터 e2를 x축 방향으로 1만큼 밀어내는 전단 변환행렬은 다음과 같다

$$S = \begin{bmatrix}x & y \end{bmatrix}\begin{bmatrix}1 & 1 \\0 & 1 \end{bmatrix}$$

 

그러므로 x축 방향으로 a만큼 미는 전단 변환행렬은 다음과 같다.

 

$$S =\begin{bmatrix}1 & a \\0 & 1 \end{bmatrix}$$

 

아핀 변환 (Affine Transform)

이렇게 크기 + 회전 + 이동 을 하나의 '점' 또는 '도형'에 변환시킨 것을 아핀변환이라고 한다.

$$v' = v \cdot\ S\cdot\ R + T$$

아핀 변환은 기본적으로 '비선형' 변환이다. 그러므로 선형성을 만족하지 않는다. ( 이동 때문 )

몇천개의 Vertex에 해당 변환을 순서대로 작업하는것은 성능에 문제가 될 수 있다.

이를 위해서 이동 변환이 선형성을 만족하는 선형 변환으로 변환한다.

 

곱셈으로 변화시킬 필요성이 있는데 (선형성을 만족하기 위하여) 아무리 생각해도

$$ \begin{bmatrix}x & y  \end{bmatrix}
\begin{bmatrix}a & b \\c & d \end{bmatrix}
= \begin{bmatrix}x + e & y + f \end{bmatrix} $$

같은 행렬은 존재하지 않는다.

대신 위에서 설명했던 전단 변환을 사용하여 처리해보자

 

전단 변환을 사용하면 하나의 표준 기저 벡터를 미는 것 (이동) 이 가능했다.

즉 (e1, e2)에서 e2의 x만 변경하게 됐는데, 이를 1이라는 값을 추가해 3차원으로 변경해본다.

이렇게 3차원인 공간에서 x축과 y축을 (a, b) 만큼 밀었을때 z는 1인 평면상에서 이동한 결과를 가지게 된다.

$$\begin{bmatrix}x & y & 1 \end
{bmatrix}\begin{bmatrix}1 & 0 & 0 \\0 & 1 & 0 \\ a & b & 1 \end{bmatrix}
= \begin{bmatrix}x + a & y + b & 1  \end{bmatrix}$$

 

이렇게 한 차원 위에서 변환 작업을 하면 이동, 회전, 크기 변환을 선형적으로 처리할 수 있는데 이러한 변환을 (선형적인) 아핀 변환 이라고 한다.

 

이동, 회전, 크기 변환이 모두 선형적이기 때문에 이를 하나의 행렬로 처리할 수 있다.

 

동차좌표

이동은 행렬곱에서 선형적이지 않았다. (위에서 말한 덧셈요소 때문이다.)

이를 위해서 우리는 한 차원을 올리고 밀기 연산을 통해서 선형적으로 처리할 수 있었는데,

이렇게 이동까지 곱셈으로 만들기 위해 한 차원을 올린 좌표계를 '동차좌표계' 라고 한다.

(동차좌표의 자세한 설명은 하지 않는다, x, y, z, 1 / wx, wy, wz, w 같은걸 설명해봤자 초보자에겐 이해가 안된다. 나중에 원근투영에서 다시 다룬다.)

 

이제 3차원에서의 변환을 생각해보자

회전과 크기는 3 x 3의 행렬로 처리할 수 있으나, 이동은 한 차원을 올린 동차좌표계에서만 처리가 가능하다

(즉 이동 행렬은 이 상태에선 4 x 4 의 동차좌표이다)

이를 위해 회전과 크기도 동차좌표계로 변경한 후 선형변환한다.

 

$$ \begin{bmatrix}Sx & 0 & 0 & 0 \\0 & Sy & 0 & 0 \\ 0 & 0 & Sz & 0 \\ 0 & 0& 0& 1\end{bmatrix}
\begin{bmatrix}Xx & Xy & Xz & 0 \\Yx & Yy & Yz & 0 \\ Zx & Zy & Zz & 0 \\ 0 & 0& 0& 1\end{bmatrix}
\begin{bmatrix}1 & 0 & 0 & 0 \\0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ x & y & z& 1\end{bmatrix} = SRT $$

 

이것이 월드변환의 최종 행렬 식이다.

 

( 회전은 오일러 변환을 사용했다. 오일러 변환을 사용하지 않을거면 x, y, z 순서를 맞춘 후 앞에서 설명했던 회전 행렬의 Rx, Ry, Rz 회전을 적용시키면 된다. 오일러 변환에 대해서는 하나의 글로 따로 다룰것이기 때문에 이 글에서는 다루지 않는다.)