본문 바로가기

Graphics Note

[Mathematics] matrices for transformation

Transformation 은 컴퓨터 그래픽스, 특히 3D 렌더링에서 모델을 표현하는데 있어서 중요한 개념 중 하나이다. 모델은 여러 정점(vertex)들로 이루어져 있는데, 정점의 좌표는 위치벡터로써 표현된다. 이렇게 표현되는 모델을 3D 월드좌표상의 원하는 위치에 표현해주기 위해선 모든 정점들에 대해서 원하는 좌표에 맞게 위치벡터를 수정해줘야 한다. 이 상황에서 수학적으로 '잘' 연산을 해주면 이동(translation), 크기변환(scaling), 회전(rotation)등을 통해 원하는 위치에 원하는 크기, 알맞은 돌림(?) 으로 모델을 움직여줄 수 있다. 이러한 변환을 아핀변환(affine transformation) 이라 한다.

 

그렇다면 위치벡터에 어떠한 연산을 해줘야 이동, 크기, 회전에 변화를 줄 수 있을까?

 

이동(translation) 변환

2D 좌표상의 한 점 v = (x,y) 를 x축 방향으로 a만큼, y축 방향으로 b만큼 이동하려면 어떻게 해야되나?  답은 간단하다. x에 a를

 

더해주고, y에 b를 더해주면 된다. 즉, v' = (x+a, y+b) 으로 새로운 정점을 표현할 수 있다. 3D에서도 마찬가지이다. (x, y, z) 정점의 각 요소에 대해서 원하는 이동변환값 만큼 더해주면 된다.

이를 매트릭스로 표현하면,

[math!]\begin{bmatrix}x'\\y'\\z'\\1\end{bmatrix} = \begin{bmatrix} 1&0&0&T_x\\ 0&1&0&T_y\\ 0&0&1&T_z\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix}x\\y\\z\\1\end{bmatrix}[/math!]

와 같다. 매트릭스 연산을 하면 아까의 수식이 나오게된다.

 

 

크기(scale) 변환

크기변환도 이동과 크게 다를것이 없다. 2D 좌표상의 한 점 v = (x, y) 에 대해서 x축으로 A만큼, y축으로 B만큼 크기를 확장하려면 각 요소에 원하는 값을 곱해주면 된다. 모든 정점들의 x, y 요소에 대해서 같은값을 곱해준다면 결과적으로 그 크기는 x축으로 A만큼, y축으로 B만큼 확장된 형태를 띄게된다. v' = (Ax, By). 3D 좌표상에서도 차이 없이 z축에 대해 C만큼 곱해주면 된다. 즉, v = (x, y, z) 의 크기변환은 v' = (Ax, By, Cz)가 된다.

이를 매트릭스로 표현하면,

[math!]\begin{bmatrix}x'\\y'\\z'\\1\end{bmatrix} = \begin{bmatrix}S_x&0&0&0\\ 0&S_y&0&0\\ 0&0&S_z&0\\ 0&0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\z\\1\end{bmatrix}[/math!]

와 같다. 중요한점 두가지는 scaling에 대해서 항등원은 [A,B,C]=[1,1,1] 이라는것이고, 모델의 원점과 좌표축의 원점이 일치하지 않는 상태에서 크기변환을 하면 축을 기준으로 위치까지 바뀐다는점이다. 그래픽스에서는 이를 방지하기위해 모델을 좌표중심으로 '이동변환'한 후 '크기변환'하고 다시 '이동변환'으로 원래의 위치에 되돌려놓는 작업을 한다. (DX에서는 기준이 모델좌표계이기때문에 크기변환을 먼저 수행해준 후 다른 변환을 수행한다.)

 

크기변환을 응용하면 반전(reflection)도 구할 수 있다. 정점 각 요소에 곱해질 변환값을 -1로한다면 축을 기준으로 반전된 모델을 구할 수 있을것이다.

 

 

회전(rotation) 변환

모델을 회전하기 위해서는 삼각함수에 대한 기본적인 이해가 필요하다. (알고있다는 가정하에..) 우선 2D 좌표에서의 회전변환을 살펴보자. 회전을 위해서 직교좌표(orthogonal coordinates)의 정점표현을 극좌표(polar coordinates)로 표현하여 계산한다. 즉, 정점 v = (x, y)는 극좌표상에서 v = (Rcosθ, Rsinθ) 가 된다. 이 정점 v를 좌표의 중심을 기준으로 α만큼 회전한다면 x' = Rcos(θ+α), y' = Rsin(θ+α) 가 될것이다. 표현 자체는 참 쉽다. 여기서 잠깐 추억의 삼각함수 공식을 살펴보자

[math!]\begin{aligned} \sin(\alpha \pm \beta) &= \sin(\alpha)\cos(\beta) \pm \cos(\alpha)\sin(\beta)\\  \cos(\alpha \pm \beta) &= \cos(\alpha)\cos(\beta) \mp \sin(\alpha)\sin(\beta) \end{aligned}[/math!]

이 공식으로부터 [math]x'[/math]와 [math]y'[/math]는  [math]x' = R( \cos(\theta)\cos(\alpha) - \sin(\theta)\sin(\alpha) ),  y' = R( \sin(\theta)\cos(\alpha) + \cos(\theta)\sin(\alpha) )[/math]로 표현되며 이를 기존 정점[math](R\cos\theta, R\sin\theta)[/math]에 대한 연산으로 표현할 수 있는 형태가 된다. 즉, [math]x' = x\cos\alpha - y\sin\alpha[/math] 이며 [math]y' = x\sin\alpha + y\sin\alpha[/math] 이다.

이를 매트릭스로 표현하면,

[math!]\begin{bmatrix}x'\\y'\\1\end{bmatrix} = \begin{bmatrix}\cos\alpha&-\sin\alpha&0\\ \sin\alpha&\cos\alpha&0\\0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\1\end{bmatrix}[/math!]

이다. 크기변환과 마찬가지로 회전변환은 좌표중심점을 기준으로 회전변환을 수행하기 때문에, 모델의 중심을 좌표중심으로 '이동변환' 후 '회전변환'을 수행하고 다시 원래의 위치로 '이동변환' 해줘야한다. (그래서 DX에서는 크기변환, 회전변환, 이동변환 의 순서로 변환을 수행한다.)

3D 에서의 회전변환도 2D와 크게 다르지 않다. 입체적으로 생각한다면, 2D에서의 회전변환은 z축을 중심으로 한 회전이다. 그 의미 그대로 3D에서 z-축을 중심으로 한 회전은

[math!]\begin{bmatrix}x'\\y'\\1\end{bmatrix} = \begin{bmatrix}\cos\alpha&-\sin\alpha&0&0\\ \sin\alpha&\cos\alpha&0&0\\ 0&0&1&0\\ 0&0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\z\\1\end{bmatrix}[/math!]

이며, 같은 원리로 x-축을 중심으로 한 회전은

[math!]\begin{bmatrix}x'\\y'\\1\end{bmatrix} = \begin{bmatrix} 1&0&0&0\\ 0&\cos\alpha&-\sin\alpha&0\\ 0&\sin\alpha&\cos\alpha&0\\ 0&0&0&1 \end{bmatrix}\begin{bmatrix}x\\y\\z\\1\end{bmatrix}[/math!]

, y-축을 중심으로 한 회전은

[math!]\begin{bmatrix}x'\\y'\\1\end{bmatrix} = \begin{bmatrix}\cos\alpha&0&\sin\alpha&0\\ 0&1&0&0\\ -\sin\alpha&0&\cos\alpha&0\\ 0&0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\z\\1\end{bmatrix}[/math!]

와 같이 표현된다.

 

임의의 축에 대한 회전은 각 축에 대한 회전의 결합된 형태이므로 위 세 축에 대한 회전변환으로 충분히 표현할 수 있다. (물론 프로그래밍 상으론 짐벌락 이라는 문제가 존재하므로 특수한 경우엔 사원수를 이용한 회전도 고려해야한다.)

 

 

matrices for transformation

세 가지 변환에 대한 매트릭스 표현을 알아보았다. 이렇게 구해진 매트릭스는 모델의 각 정점에 대해 연산되어 변환된 모델을 나타낸다.

[math!]V' = V \times M_{scale} \times M_{rotation} \times M_{translation} [/math!]

으로 변환이 완료된 새로운 모델을 표현할 수 있다.

여기서 기존 정점 오른쪽으로 매트릭스를 곱해나간것은 모델 좌표를 기준으로 변환을 주는것이다. 반대로 기존 정점벡터의 왼쪽으로 매트릭스를 곱해나가면 절대좌표(월드좌표)를 기준으로 변환을 주는것이다.

물론 매트릭스는 모델의 좌표변환 외에도 많은곳에 이용된다. 카메라 변환이나 프로젝션에도 매트릭스가 사용되며 이에 대해서는 다음에 정리해야겠다.

 

참고 : Mathematics for computer graphics 3rd / John Vince

'Graphics Note' 카테고리의 다른 글

[Mathematics] rotate model using quaternion  (4) 2013.07.11
[Mathematics] quaternion(사원수)  (1) 2013.07.10
[Mathematics] complex number  (5) 2013.07.01
유리같은 셰이딩  (0) 2013.06.25
Directx DXUT Library build & include  (0) 2013.03.30