[그래픽스]Transformations
Transformations
단순하게 직역을 한다면 이동을 뜻한다.
그래픽스에서는 Point 혹은 벡터를 가져와 그 Point 혹은 벡터를 다른 위치로 이동시키는 것을 뜻한다.

또한 이는 선형이동으로 이루어지며, Point 혹은 Vector 의 이동표현을 다른 Point 혹은 Vector 로 표현한다.
Homogeneous Coordinates 에서 수식을 적용하여 Translation, Rotation, Scaling, Shearing 와 같은 기능들을
Point 혹은 Vector에 적용시키게 된다. 이때 선을 변경하는것은 선 성분의 끝점만 이동시킴으로써 선을 보존시킨다.
현재 그래픽스의 대부분의 Transformations는 affine(아핀)영역에서 수행하고있다.
이 Transformations는 정확히 어떤 동작을 수행하는것일까?
1.Translation
영어를 단순 직역하게되면, 변환정도로 해석할수있는데, 이는 Object가 본래의 위치에 존재하고있다가 d벡터에 의해 위치가 변환(이동)하게되는데, 이기능이 바로 Translation이다.


2.Rotation
Rotation은 이름에서도 알수있듯이 회전을 발생시키는 기능이다. Rotation 기능을 수행할때는 3가지 필수 요건이 필요하다
우선 첫번째는 Fixed point다. Fixed point는 객체를 제자리에 고정시키는 역할로 Fixed point가 존재하지 않을경우 Object는 원점(World Space)을 기준으로 회전하기때문에, 원하는 모습으로 회전이 수행되지 않을수있다.


두번째 요소는 Rotation angle이다. 얼마나 회전할지에 대한 값을 주는것인데, 이값은 오른손 시스템에 의하여 반시계방향으로 회전하기 때문에, 이를 고려하여 값을 할당해야 한다.
3번째 요소는 Rotation axis in 3D 이다. 해당축의 값을 기준으로 회전을 실행하는것인데, 만약 Z축을 Rotation axis로 지정하였다면, Z축의 Rotation값은 변경되지않는다는것을 뜻한다.
3.Scaling
Scaling 은 Object의 크기를 작거나 크게 조절하는 기능을 수행한다.
Scaling중에서도 모든방향에대해 Scaling을 적용하는것은 Uniform,
하나 혹은 두개의 방향에 대해서만 Scaling을 적용하는것을 NonUniform이라 칭한다.
Rotation과 동일하게 Scaling을 수행하기 위해서도, 3가지 요소가 필요하다.
첫번째 요소는 Rotation과 동일한 Fixed point이다, Scaling역시 고정된 위치에서 작업을수행해야하기 때문에 필요하다.
두번째 요소는 Scaling을 수행할 방향(Direction to scale)을 지정해 주어야한다.
마지막 요소는 크기를 얼마나 키울껀지 지정하는 Scale factor다. factor값은 1보다 큰경우( 1 < a) 크기가 더 커지게 되며, 반대로 0과 1사이일 경우(0 ≤ a < 1) 즉, factor가 소수일 경우다. 이는 우리가 Object를 factor배 한다고 생각하면 이해가 쉽다. ex) factor : 2인경우, Object를 현재 크기에서 2배만큼 지정한 방향으로 크기를 키우겠다.
factor : 0.5인경우 Object를 현재 크기에서 0.5배만큼 지정한방향으로 크기를 줄이겠다.
그렇다면 factor가 음수인경우에는 어떻게 될까? 결과부터 말하면, Object는 기존모습에서 지정한 방향(축)으로 반사된것처럼 보이게된다.
위 세가지 기능중 1.Translation과 2.Rotation의 처럼, Object의 크기를 변경하는것같이 형태를 변경하지 못하는 작업들을 Rigid-Body Transformations 라고 칭한다.
반대로 3.Scaling의 경우 크기,형태를 변경하므로 non-Rigid-Body Transformations 라고 칭한다.
Transformations in Homogeneous Coordinates
다음으로 알아볼것은 위의 기능들을 어떻게 구현하는가 이다.
이전에도 설명했듯 Transformations는 affine영역에서 수행되며, affine영역은 Homogeneous Coordinates(동차 좌표계)를 사용한다. 이를 기준으로 앞서 설명했던 기능들을 수행하는방법을 Homogeneous Coordinates를 기준으로 설명하겠다.
** Homogeneous Coordinates 변환 예시

1.Translation
Translation은 Point P를 Vector d 만큼 움직인 것이기때문에, P의 각 좌표에 d의 좌표를 더한값 P프라임이 된다. 이에대한 수식은 아래 그림과 같다.

Homogeneous Coordinates를 수식으로 정리하면 아래와 같다.

수식을 다시 Homogeneous Coordinates로 변환하면 아래그림으로 변한다.

행렬 T에 벡터를 대입하면 Translation기능을 구현할수있다.
만일 수행한 Traslation 작업을 되돌리고 싶다면 행렬은 아래와 같다.

2.Rotation
Rotation의 경우 다른 작업들보다 계산해야할 수식이 많은 편이다. 그이유는 Rotation은 각회전축(x,y,z)별로 적용해야할 수식이 모두 다르기 때문이다.
원점에서 고정된 점에 대해 회전을 적용하면 수식은 아래와 같다.
θ = rotation angle
Z축을 Rotation axis로 지정했을때


X축을 Rotation axis로 지정했을때

Y축을 Rotation axis로 지정했을때

Rotation한 값들을 다시 원래대로 돌리고 싶을때는 기존에 받은 θ값(Rotation angle)을 음수로 Rotation작업을 다시 수행하면된다.
이때 cos(- θ) = cos θ 이고 sin(- θ) = -sin θ 이므로 Rotation 행렬의 모습을 고려했을때 R행렬의 역은 R의 전치행렬이 된다.
이처럼 역행렬이 전치행렬이 되는경우 이를 직교행렬이라고 칭한다.

3.Scaling
Scaling은 scaling factor값을 조정하여 factor배 만큼 커진것이기에, 기존에 단위 행렬이었던 Homogeneous Coordinates에서 단위행렬값들을 factor 값으로 변경해주면된다 자세한 수식은 아래와 같다.


단위 행렬값에 S가 대입되면서, P에는 각각 x,y,z에 대한 Scale값이 곱해져 계산된다.

만약 Scaling 해서 키웠던 값을 다시 줄이고싶다면, Scale Factor S에 역수를 취해 Homogeneous Coordinates를 표현하고 행렬을 계산하면된다.

Concatenation of Transformations
위에서 Transformations의 기능들을 구현하는 방법에 대해서 알아보았다면, 이번에는 해당 기능들이 어떻게 적용되는지에대해 알아보겠다.
Affine transformations의 기능들은 함께 곱해져서 수행된다. 기능들은 정해진 순서가 있는것이 아닌, 임의로 순서를 지정해서 3개의 연속 작업을 수행하게 된다.

이 순서를 지정하는 작업은 굉장히 중요한데, 지금부터 그이유를 설명해주겠다.
이전에 설명했던 기능중 Rotation을 생각해보자. Rotation은 보편적인 상황에서 Fixed point를 기준으로 회전한다. 그런데 이것이 Fixed point 그 자리에서 회전하는것이 아닌, 원점으로 이동해서 회전을 수행한후, 다시 Fixed point로 돌아오는것임을 알고있었는가? 우리가 그자리에서 회전한다고 생각한것은 눈에보이지 않을뿐 실제로는 Translation기능을 같이 수행했던것이다. 이를 Homogeneous Coordinates로 표현하게되면 아래와 같다.


이때 주의해야 할점이 있다. 일반적으로 곱셈을 한다고 생각하면 왼쪽에있는것부터 곱셈이된다고 생각할수있는데, Transformations에서의 수행은 뒤에서부터 즉, 오른쪽에서 왼쪽 순서대로 수행되고있다. 헷갈릴수있는 부분인데 항상 이부분을 고려하며, 작성해야 한다.
이런 특성때문에, Transformation을 Concatenating 할때는 Translation을 가장마지막에 수행하고, Rotation 과 Scaling을 우선적으로 수행할수있게 배치해야한다. 그이유는 위에서도 간단하게 이야기했었지만, Object를 원점이 아닌곳에서 Rotation이나, Scaling을 수행하게 되면, 원하던바와 다르게 적용될수있다. 그렇기에 애초에 Object가 원점이 아닌곳에 존재하여, 원점으로 옮기기위해 Translation을 수행하는것이 아니라면 Translation을 먼저 수행하도록 하는것은 지양해야한다.

- 공부하며 배운것을 정리하면서 작성하는 글입니다. 틀린부분은 언제든지 지적해주시기 바랍니다!