[한정현 컴퓨터 그래픽스] 4장 좌표계의 변환

이한결·2025년 1월 15일
0

[KUOCW]Computer Graphics

목록 보기
4/16

출처: https://www.youtube.com/watch?v=CAfdIW8M6HA&list=PLYEC1V9tJOl03WLDoUEKbiYW_Xt4W6LTl&index=5
한정현님의 컴퓨터그래픽스 4장 강의를 기반으로 제작한 블로그입니다.

Affine Transform

Scaling

Scaling은 한마디로 축소 확대입니다. 좌표 (x,y)가 주어졌을 때 Scale 값 SxS_x, SyS_y을 곱해서 (Sxx,Syy)(S_xx,S_yy)를 얻습니다.

첫번째 예시는 Scale값이 모든 방향에 대해서 2배 해준 경우입니다. 이 경우 모형은 그대로 유지된채로 크기만 2배로 커졌습니다.

두번째 예시는 세로로 1/2배, 가로로 3/2배를 한 경우 입니다. 모형이 찌그러진채로 크기가 변한 것을 확인할 수 있습니다.

Rotation

(x,y)의 좌표 값을 갖고있는 점 p에대해서 θ\theta만큼 회전을 걸었을 때 새로운 점 pp’를 얻게 됩니다. 이때의 좌표는 (x,y)(x’,y’)입니다.

초기에 점 p가 x축으로부터 ϕ\phi 각도만큼 올라가 있는 것을 알고있으므로 (x,y)대신 정확한 좌표를 얻을 수 있습니다. x=rcosϕ,y=rsinϕx = rcos\phi, y = rsin\phi 입니다.

회전해서 얻은 각 pp’의 경우 길이의 변환은 없고 각도를 전부 알고 있기 때문에 이때도 정확한 값을 얻을 수 있습니다. x=rcos(ϕ+θ),y=rsin(ϕ+θ)x’ = rcos(\phi + \theta), y = rsin(\phi + \theta) 입니다.

이렇게 새로운 점의 좌표는 cos과 sin안에 2개의 각의 합으로 나타나있고, 이를 풀어서 쓰면 최종적으로 3번째줄의 수식으로 나타낼 수 있습니다. 이때 x=rcosϕ,y=rsinϕx = rcos\phi, y = rsin\phi 값을 대입해서 x와 y에 대한 값으로 얻을 수 있게 됐습니다.

결론적으로 위의 수식과같이 두 점 사이의 관계를 나타낼 수 있습니다.

회전은 일반적으로 반시계(counter-clockwise) 방향으로 표현합니다. 따라서 시계 방향으로 회전할 때는 각도에 마이너스 부호를 붙여야 됩니다.

위의 수식에서 첫번째 경우는 90도를 회전한 경우고, 두번째와 세번째는 같은 경우이지만 두번째는 -90도, 세번째는 270도 돌린 동일한 경우입니다.

Translation

주어진 점 (x,y)에서 (dx,dy)(d_x, d_y)만큼 옮긴 것입니다. 이전에 Scaling과 Roatation은 행렬의 곱셈으로 표현됐는데 Translation은 덧셈으로 표현되어 있어서 이를 곱셈으로 통일 시키고 싶습니다.

이를 위해서 homogeneous coordinates 개념을 도입했습니다. (x,y)(x,y,1)(x,y) → (x,y,1) 2차원 좌표가 주어졌을 때 3차원 좌표에 그냥 1을 집어 넣으면 됩니다.

이후 단위벡터의 3번째 열의 0 값에 dx,dyd_x, d_y값을 넣으면 Translation matrix를 얻을 수 있습니다.

결론적으로 위의 결과를 얻을 수 있는데, 마지막 1만 제거 한다면 동일한 결과를 얻을 수 있게 됩니다.

기존 Matrix들과의 차이점은 여전히 존재하긴 합니다. 기존의 행렬들은 2X2 matrix이지만, 지금은 3X3 matrix입니다. 해당 차이는 추후에 다시 한번 설명할 예정입니다.

Homogeneous coordinates

이전에 사용한 homogeneous coordinates에서는 단순히 3차원에 1을 추가했습니다. 하지만 0이아닌 어떤 값도 대입 가능하고 일반적으로 이를 w라고 정의합니다. 단 w를 집어넣으면 x와 y앞에도 w를 대입해야합니다. 따라서 (x,y) → (wx, wy, w)로 나타낼 수 있습니다.

예를 들어서 (2,3)이 주어졌을 때 (2,3,1), (4,6,2), (6,9,3) 모두 같은 경우입니다. 이처럼 무한한 경우를 나타낼 수 있습니다.

이를 시각화하면 우리에게 있는 x,y 2차원 좌표에서 w를 추가한 것입니다. 그리고 w값에 따라서 무한히 많은 경우를 생성할 수 있기 때문에 (2,3,1)과 같은 수많은 경우를 검은색 직선으로 표현할 수 있습니다.

그러면 반대로 3차원 Homogeneous coordinates가 주어졌을 때 이를 2차원으로 어떻게 바꿀 수 있을까요? 3차원 좌표 값은 x,y에 나눠주면 됩니다. (x,y,w)가 주어졌을 때 (x/w, y/w) 값으로 나타낼 수 있습니다. 그림상으로보면 w값으로 나눴을 때 (2,3,1)이라는 파란 평면의 한 점으로 나타나고 여기서 3차원 값은 필요 없으니까 xy평면에 투영 시키면 (2,3)이라는 값을 얻게 됩니다.

이전에 Scaling과 Rotation은 2X2 matrix인데 Translation은 3X3 matrix여서 문제가 된 경우가 있었습니다. 따라서 2X2인 matrix를 위의 그림처럼 3X3 matrix로 바꾸면됩니다. 이때 곱해지는 값은 3x1 matrix가 필요하므로 (x,y) → (x,y,1)로 나타낼 수 있습니다.

이제 Scaling, Rotation, Translation 모두 3x3 matrix로 나타낼 수 있습니다. 위의 그림처럼 일반적으로 하나의 변형보다는 여러개의 변형이 한번에 나타나는 경우가 더 많습니다.

따라서 위의 그림처럼 모든 변형을 하나의 행렬로 나타낼 수 있습니다. 여기서 주의해야 할 점은 회전이 먼저 이루어지고 이동하기때문에 이 순서를 조심해야합니다. 먼저 이루어진 변형을 오른쪽에 쓰고, 그다음부터 차례로 작성해야합니다. 즉 교환법칙이 성립하지 않으니 조심해야합니다.

원점이 아닌 곳에서의 Rotation

지금까지는 원점에서의 Rotation만 고려했지만, 원점이 아닌 곳에서의 Rotation을 생각해보도록 하겠습니다. 위의 예시처럼 (5,2)라는 점이 (3,2)를 기준으로 90도 회전했다고 가정해 보겠습니다.

이전처럼 식에 90도를 대입할 경우 위의 Rotation matrix가 생성되고, 이를 기반으로 계산했을 경우 (-2,5)라는 정답 (3,4)와는 다른 답이 나옵니다. 왜냐하면 우리가 90도를 대입한 Rotation matrix는 원점을 기준으로 구한 값이기 때문입니다. 그러면 (3,2)를 원점처럼 취급해준다면 문제가 발생하지 않겠죠?

따라서 위의 그림처럼 (3,2)를 원점으로 이동시키고, 여기서 90도 회전시키고, 다시 (3,2)로 이동시켜주는 것입니다.

Affine Transform의 조합

지금까지 Translation, Rotation, Scaling에 대해서 각 Matrix와 3가지 Matrix를 조합하는 방법에 대해서 알아봤습니다.

위의그림처럼 Matrix들을 조합할 때 공통점이 있습니다. 바로 마지막 3번째 행에서의 값은 항상 (0,0,1)이라는 점입니다. 그러면 해당 값은 무시하면 matrix는 2X3이 됩니다. 이때 왼쪽 2x2를 L, 오른쪽 2x1을 t라고 하면 [L,t]라는 matrix로 나타낼 수 있습니다. 이때 L에는 linear transformation이 반영되지만 translation은 절대 반영되지 않습니다. 위의 결과를 봐도 dxd_x, dyd_y의 값이 L에 해당되지 않는 것을 확인할 수 있습니다.

결론적으로 수많은 변형들을 조합해도 [L,t]의 형태로 나타나는 것을 알 수 있습니다. 이를 해석해보면 어떠한 점 p가 주어졌을 때 linear transformation(L)을 먼저 적용한 후 translation(t)를 하는 것, 수식적으로 Lp+tLp + t라고 나타낼 수 있습니다.

Rigid body motion

Scaling을 고려하지 않고, Rotation과 Translation만 고려해봅시다. 그러면 물체의 모양이 변하지 않는 것을 알 수 있습니다. 이러한 경우를 rigid body motion이라고 합니다.

여기서도 수많은 rotation과 translation의 조합이 있을 수 있는데 결론적으로 마지막에는 3x3 matrix를 얻을 수 있고 여기서 기존의 [L,t]를 [R,t]로 정의할 수 있습니다. R은 L이긴하지만 rotation만을 나타내는 것입니다. 여기서도 동일하게 R이 먼저 적용되고 이후에 t가 적용이 됩니다.

3D scaling

지금까지 2차원의 변형들만 다뤘는데 이를 3차원으로 확대해 보도록 하겠습니다. 동일하게 3가지 축 x,y,z에 대해서 각각 Scaling 값을 변환할 수 있습니다. 변형된 첫번째 사진은 Scaling 값이 동일하기 때문에 이때의 변환을 uniform scaling, 2번째 변환된 사진은 동일하지 않기 때문에 non-uniform scaling으록 구분할 수 있습니다.

3차원 scaling matrix는 위와 같이 단순히 z축이 추가된 형태입니다.

3D rotation

Z축을 기준으로 한 회전

Rotation도 역시 3차원으로 확장해보도록 하겠습니다. 2차원에서는 점을 기준으로 회전시켰다면, 3차원에서는 점을 기준으로 할 경우 너무 많은 경우가 존재하기 때문에 축을 기준으로 회전시킵니다.

우선 가장 간단한 z축을 기준으로 90도를 회전한 경우를 시각화 한 사진이 위와 같습니다.

이전과 같이 z축을 기준으로 90도를 돌렸을 때 주전자 위의 임의의 점 p=(x,y,z)가 어떻게 바뀌는지 고려해보겠습니다. 우선 z 좌표를 먼저 고려해보면 z좌표는 변하지 않을 것입니다. z축을 기준으로 돌렸기 때문에 z값들은 변하지 않는 것을 위의 그림을 통해서 시각적으로 혹은 상식으로 알 수 있을 것입니다. 그리고 x와 y좌표는 xy평면에서 고려해 본다면 결론적으로 2차원에서의 변형과 동일하게 변형될 것 입니다. 결론적으로 가운데 부분과 같이 변형된 좌표를 구할 수 있고 이를 행렬로 나타내면 오른쪽과 같이 표현할 수 있습니다.

X축을 기준으로 한 회전

이전에 z축을 기준으로 회전했을 때 z 좌표는 변하지 않았으니, 동일하게 x축을 기준으로 회전해도 x 좌표는 변하지 않을 것이라는 사실을 알 수 있습니다.

x축을 회전했을 때 위의 사진처럼 시각화 할 수 있습니다. 이때 y축이 z축을 따라서 빨간색 화살표 방향으로 회전하는 것을 알 수 있습니다. 그러면 이전에 z축을 회전했을 때는 어땠을까요?

사진을 다시 가져와서 본다면 파란색 화살표를 따라서 x축이 y축 방향으로 회전하는 것을 알 수 있습니다. 즉 z축 회전에서는 x→y, x축 회전에서는 y→z 방향으로 바뀌는 것을 알 수 있습니다. 그러면 x축 회전은 z축 회전에서 x축이 y축으로, y축이 z축으로 변한 것을 알 수 있습니다.

x→y, y→z를 적용한다면 위의 그림처럼 쉽게 변환된 좌표를 구할 수 있습니다.

3가지 변환된 좌표를 기준으로 우리는 변환 행렬을 위와 같이 구할 수 있습니다.

Y축을 기준으로 한 회전

동일하게 y축을 기준으로 회전을 한다면 위와 같이 시각화 할 수 있고, 이때는 초록색 화살표를 따라서 z→x방향으로 회전하게 됩니다. 그러면 z축에서 x→y방향으로 회전했기 때문에 결론적으로 z가 x의 역할, x가 y의 역할을 하게됩니다. 이를 기반으로 오른쪽과 같이 변환 행렬을 구할 수 있습니다.

3차원 회전의 방향성

2차원에서 반시계 방향으로 회전할 때 +, 시계 방향으로 회전할 때 -라고 정의 했었습니다. 그러면 3차원에서는 어떻게 정의할까요? 동일합니다. Y축을 기준으로 회전한다 했을 때 Y축을 하늘에서 바라본다 생각하고(그러면 xz평면이 보이겠죠) 반시계 방향이면 +, 시계 방향이면 -가 됩니다.

3D Translation

Translation은 3차원에서 2차원과 동일하게 진행되고, 그냥 단순히 차원이 하나 추가되어서 4x4 matrix가 됩니다. 그리고 2차원에서 진행한 것처럼 scaling과 translation도 차원 통일을 위해서 4x4 matrix로 변환합니다.

World Transform

우리가 2개의 물체를 만든다음에 하나의 공간으로 변환하기 위해서는 World Transform이라는 방식이 필요합니다. 물체를 만든 공간을 object space, 그리고 이를 하나의 공간의로 가져왔을 때 이렇게 공통된 하나의 공간을 world space라고합니다. 그리고 object space → world space로 변환하는 과정을 world transform이라고합니다.

왼쪽의 구는 단순히 scale만 2배를 진행했기 때문에 간단하게 위와 같은 식을 통해서 구의 크기를 2배로 늘릴 수 있습니다. 하지만 주전자의 경우 rotation과 translation이 진행되었기 때문에 조금 더 복잡한 형태인 것을 알 수 있습니다.

주전자의 경우 y축으로 90도 회전을 하고, (7,0,0)만큼 이동한 것을 확인할 수 있습니다.

따라서 위의 수식을 따라서 진행하면 최종적으로 (10,2,0)이라는 좌표를 얻을 수 있습니다. 참고로 마지막 줄은 2가지 변형을 한번에 계산하는 과정을 나타낸 것입니다. 단 이때 2차원에서와 마찬가지로 교환법칙은 성립 하지 않습니다.

3차원 변환에서도 2차원 변형과 마찬가지로 교환법칙은 성립하지 않고, 마지막 행의 값은 (0,0,0,1)로 나타나게 됩니다. 그리고 동일하게 [L,t]로 나타낼 수 있고 여기서 L은 3x4 matrix, t는 3x1 matrix로 나타납니다.

Rotation and Object-space Basis

이전에 배운 object space를 world space로 변환해주는 world transform을 적용할 때 Basis가 어떻게 변하는지를 알아보도록 하겠습니다. 우선 Rotation 부분만 확인해 보겠습니다.

Object space의 basis는 {u,v,n} 3가지, World space의 basis는 {e1,e2,e3} 3가지 입니다. Object space는 물체와 붙어있어서 동일하게 작동하고, world space는 고정이라고 생각하시면 됩니다. 그림을 보시면 주전자가 y를 기준으로 90도 회전했을 때 World space의 basis는 3가지가 동일하게 존재하고, object space의 basis는 물체가 회전한 만큼 바뀐 것을 확인할 수 있습니다.

원래 u는 e1과 동일했지만 R로 인해서 변했기 때문에 위와 같이 e1에 R을 곱해주면 u를 구할 수 있습니다.

마찬가지로 e2와 e3에도 적용한다면 v,n을 얻을 수 있습니다. 따라서 R에 관한 3가지 식을 얻을 수 잇습니다.

3가지 식을 연결하면 위의 수식이 됩니다. 이때 R옆에 있는 3x3 matrix는 단위 행렬이기때문에 좌변은 R만으로 나타낼 수 있습니다. 따라서 물체의 새롭게 정의된 u,v,n 행렬을 보면 R 행렬이 어떤것인지 쉽게 파악할 수 있게 됩니다. 반대로 R이 주어져있다면 그에 대응하는 u,v,n을 쉽게 찾을 수 있습니다.

이전에 y축으로 90도 회전해서 얻은 u,v,n의 값을 알 때 R을 구하는 예제를 보도록 하겠습니다.

우리는 u,v,n을 알고 있기 때문에 이로부터 위의 식처럼 R을 얻을 수 있게 됩니다.

사실 지금까지 x,y,z축을 기준으로 회전하는 경우만 다루왔지만, 임의의 축에 대한 회전이 존재할 수도 있습니다. 이럴경우 u,v,n을 통해서 R을 얻을 수 있고 반대의 경우도 얻을 수 있게 됩니다.

Inverse of Translation and Scaling

지금까지 진행한 방법들의 역변환 하는 방법을 알아보도록 하겠습니다. 당연히 Translation은 더한만큼 빼주면 됩니다.

역변환 행렬과 기존 translation 행렬을 곱하면 당연히 단위 행렬을 얻게 됩니다.

Scaling도 곱한만큼 나눠주면 동일한 값을 얻게 됩니다.

Inverse Rotation

object space의 basis인 u,v,n은 orthonomal 하다는 특징을 갖고 있습니다. 즉 크기가 1이고 다른 basis와 곱했을 때 항상 0이라는 특징을 갖고 있습니다. 따라서 위와 같이 전치행렬과 기존행렬을 곱했을 때 단위 행렬이 나오는 것을 확인할 수 있습니다. 따라서 RT=R1R^T = R^{-1}이 성립하는 것을 확인할 수 있습니다. 즉 Inverse는 그냥 행과 열을 바꾸면 되는 것입니다.

따라서 임의의 축을 기준으로 회전했을 때 역행렬은 행과 열을 바꾼 행렬만 곱해주면 됩니다.

profile
열정으로 가득할 페이지

0개의 댓글