[컴퓨터 그래픽스] 4장 Spaces and Transforms

함지율·2024년 4월 13일

컴퓨터 그래픽스

목록 보기
1/5
post-thumbnail

Spaces and Transforms

1. Scaling

2D scaling은 scaling factors, sxs_x and sys_y로 이루어져 있을 때,

[sx00sy][xy]=[sxxsyy]\begin{bmatrix}s_x & 0 \\ 0 & s_y \end{bmatrix} \begin{bmatrix}x \\ y \end{bmatrix}= \begin{bmatrix}s_xx \\ s_yy \end{bmatrix}
Image 1 Image 2

2. Rotation


xxyy 좌표를 회전 시키기 위해서는 위의 그림을 통해 rotation matrix를 구할 수 있다.

최종적으로 나오는 rotation matrix는 다음과 같다.

[xy]=[cosθsinθsinθcosθ][xy]\begin{bmatrix}x^{'} \\ y^{'} \end{bmatrix} = \begin{bmatrix}cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix} \begin{bmatrix}x \\ y \end{bmatrix}

3. Translation and Homogeneous Coordinates

점의 평행이동은 다음과 같이 이동 거리 만큼을 더해주면 된다. 하지만, 앞서 보았던 연산들과 함께 사용하기 위해 행렬로 표기하면 더욱 편하게 연산할 수 있다. 이를 위해 homogeneous 좌표계를 도입한다.

homogeneous 좌표계는 1차원을 늘려준 좌표계이고 우리말로는 동차 좌표계라고 부른다.

(x,y)(x,y,1)(x,y) \rightarrow (x,y,1)

이렇게 homogeneous 좌표계로 변환하면 아래와 같이 행렬곱, 덧셈으로 쉽게 평행이동을 표현할 수 있다.

[10dx01dy001][xy1]=[x+dxy+dy1]\begin{bmatrix}1 & 0 & d_x \\ 0 & 1 & d_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix}x \\ y \\ 1 \end{bmatrix}= \begin{bmatrix}x+d_x \\ y+d_y \\ 1 \end{bmatrix}

Homogeneous Coordinates

다만, 주어진 2D point (x,y)(x,y)에서 homogeneous 좌표계가 반드시 (x,y,1)(x,y,1)만 존재하는 것은 아니다.

예로 cartesian 좌표계 (2,3)은 (2,3,1), (4,6,2), (6,9,3)처럼 여러 homogeneous 좌표계로 표현될 수 있으며 이를 일반화 하면 (X,Y,w)(X,Y,w)로 표현할 수 있고, 이때 w=1w=1의 plane으로 projection 시키면 (X/w,Y/w,1)(X/w, Y/w, 1)로 표현할 수 있으며 cartesian 좌표계에서는 (X/w,Y/w)(X/w,Y/w)로 나타낼 수 있다.

이제 homogeneous 좌표계에서 scaling과 rotation이 2D에서 어떻게 나타낼 수 있는지 살펴보겠다.

Transform Composition

앞서 보았던 Scaling, Rotation, Translation 을 합쳐서 연산할 수 있다. 다만 순서에 따라서 결과물은 특수한 케이스를 제외하면 같은 rotation matrix와 translation matrix를 사용하더라도 달라진다.

아래의 예시는 rotation을 적용한 후 translation을 적용한 결과이다.

아래의 결과는 translation을 적용한 후 rotation을 적용한 결과이다. 이를 통해 알 수 있듯 순서에 따라 결과물이 달라지며 실제 연산 matrix의 결과물도 서로 다른 것을 확인할 수 있다.

Affine Transform

Affine Transform을 크게 2가지로 이루어져있다.

1. Linear transform

  • Scaling(S)

  • Rotation(R)

  • and many others

2. Translation(T)

예시로, 한번에 나타내게 되면 아래의 수식처럼 나타낼 수 있다.

S,R을 묶어서 linear transform으로 나타내면 [Lt][L|t] 로 표기할 수 있다. 이렇게 하면 LL이 먼저 적용되고 나중에 tt가 적용되어 스케일링 및 회전이 먼저 일어나고 그 후에 평행이동이 이루어짐을 알 수있으며, 이때 모양과 형태가 변화하지 않음으로 강체 변환, rigid motion이라고 할 수 있다. 만약 Scaling을 하지 않았다고 한다면 단순히 [Rt][R|t]로 나타낼 수 있으며 Rp+tRp+t로 연산된다.

1. 3D Scaling

이제 3D일 경우를 살펴보자. 3D일 경우 scaling은 아래의 그림과 같이 확인할 수 있다.
단순히 한 차원만 더 늘어났다고 볼 수 있다.

2. 3D Rotation

3D rotation의 경우 xaxis(Rx),yaxis(Ry),and zaxis(Rz)x-axis (R_x), y-axis(R_y), and\space z-axis(R_z)를 고려해야한다.
이때, 쉽게 접근하면 회전하고자 하는 축을 고정시켜 놓고 나머지를 회전하는 방법이다. 여기서는 z축을 회전 시키고자 한다면 z축을 고정시켜놓고 x,y축을 회전하면 된다.

만약에 x축을 기준으로 회전을 한다고 하면 x축을 고정시키고 y, z축을 회전시키면 된다.

현재는 각 축을 고정시켜 놓고 회전을 하지만, 실제 연산에서는 순차적인 회전 matrix를 통해 한번에 회전을 수행한다.

3. 3D Translation

3D 평행이동의 경우에도 간단히 차원 하나만 늘려주면 된다.

이렇게 3D에서도 scaling, rotation, translation을 수행할 수 있으며 homogeneous 좌표계로 표현하여 한번에 [Lt][L|t]를 수행할 수 있다.

World Transform

coordinate system에서 object가 정의된 공간을 object space라고 한다. 이는 각 물체를 중심으로 하여 정의된 좌표계이다. 그러나 우리는 이러한 물체를 실제 우리가 살고 있는 world space에서 다루고자 하기에 좌표를 변환해주어야한다. 이러한 변환을 world transform이라고 한다.

world transform은 실제 world space에 존재하는 scale, rotation, translation을 통해 표현하게 된다.

3D Affine Transforms


이렇게 rotation과 translation이 함께 사용되어 하나의 matrix로 표현될 수 있으며 여기서 L을 'combined' linear transform라고 하고 t는 'combined' translation이라고 하며 [Lt][L|t]라고 표현한다.

Rotation and Object-space Basis

world transform을 하면 object space에 존재하는 Basis 또한 변할 것이다. 이때 object space basis{u,v,n}\{{u,v,n}\}이라고 하고 world space basis(standard basis){e1,e2,e3}\{{e_1,e_2,e_3}\}라고 하자. 그리고 처음에 이 둘이 같고 roation을 통해서 변화했다면 아래의 그림처럼 볼 수 있다.

world space의 각 standard basis에 Rotation을 취하게 되면 변화된 basis를 알 수 있다.

위의 마지막 수식과 같이 특정한 rotation을 거치고 나면 변화한 object-space basis를 구할 수 있다. roation-axis가 x,y,z 축이 아니라면 아래의 그림으로 나타낼 수 있다.

Inverses of Translation and Scaling

그렇다면 앞서 연산한 scaling, rotation, translation 연산의 inverse 연산은 어떻게 할까? (이러한 연산이 필요한 이유는 나중에 좌표계 변환시에 많이 사용되기 때문이다.)

scaling과 translation은 쉽게 구할 수 있다. 그렇다면 rotation matrix는 어떨까?

R1=RTR^{-1}=R^T

를 구할 수 있다. 이를 기하학적으로 살펴보면 아래 그림과 같다.

참고자료
한정현 교수님 컴퓨터 그래픽스 수업

profile
꿈 꾸는 디그다

0개의 댓글