Skip to Content
독학사독학사 3단계컴퓨터그래픽스07. 3D 기하 변환과 동차좌표 심화

이번 문서의 목표: 3차원 공간의 이동·회전·스케일을 4x4 동차좌표 행렬로 표현해 실제 점에 곱한 결과를 구할 수 있고, x·y·z축 각각을 기준으로 한 회전의 차이와 3D 합성 변환에서 순서가 결과를 바꾸는 이유를 설명할 수 있게 된다.

왜 3D에서는 행렬이 4x4가 되는가

04편에서 2차원 점 (x,y)(x, y)를 동차좌표 (x,y,1)(x, y, 1)로 확장해 3×33 \times 3 행렬로 평행이동까지 표현할 수 있었습니다. 3차원 공간에서는 점이 (x,y,z)(x, y, z) 세 개의 좌표를 가지므로, 같은 방식으로 동차좌표 (x,y,z,1)(x, y, z, 1)을 만들고 4×44 \times 4 행렬을 곱합니다. 차원이 하나 늘었을 뿐 원리는 완전히 같습니다. 다만 회전만큼은 2D와 다르게 다뤄야 합니다. 2D에서는 회전축이 항상 화면에 수직인 한 방향(원점을 지나는 z축)뿐이었지만, 3D에서는 xx축, yy축, zz축 세 가지 중 어느 축을 기준으로 회전하느냐에 따라 서로 다른 행렬이 필요합니다.

쉽게 말하면: 3D 변환은 2D와 원리가 같지만 좌표가 하나 늘고, 회전은 어느 축을 중심으로 도는지부터 먼저 정해야 합니다.

1. 3D 평행이동(Translation)

쉽게 말하면: 3D 평행이동은 점을 x, y, z 세 방향으로 각각 정해진 만큼 밀어서 옮기는 것입니다.

점을 xx 방향으로 txt_x, yy 방향으로 tyt_y, zz 방향으로 tzt_z만큼 옮기는 4×44 \times 4 동차좌표 행렬은 다음과 같습니다.

T(tx,ty,tz)=[100tx010ty001tz0001]T(t_x, t_y, t_z) = \begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix}
  • 대각선(1행 1열, 2행 2열, 3행 3열, 4행 4열)은 항상 1을 유지한다.
  • 이동량 tx,ty,tzt_x, t_y, t_z는 네 번째 열의 위쪽 세 자리에 들어간다.

(2,1,3)(2, 1, 3)tx=3,ty=2,tz=1t_x=3, t_y=-2, t_z=1만큼 평행이동해 보겠습니다.

[1003010200110001][2131]=[2+31+(2)3+11]=[5141]\begin{bmatrix} 1 & 0 & 0 & 3 \\ 0 & 1 & 0 & -2 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \\ 1 \\ 3 \\ 1 \end{bmatrix} = \begin{bmatrix} 2 + 3 \\ 1 + (-2) \\ 3 + 1 \\ 1 \end{bmatrix} = \begin{bmatrix} 5 \\ -1 \\ 4 \\ 1 \end{bmatrix}
  • 첫 번째 행: 1×2+0×1+0×3+3×1=51 \times 2 + 0 \times 1 + 0 \times 3 + 3 \times 1 = 5 → 새 x좌표
  • 두 번째 행: 0×2+1×1+0×3+(2)×1=10 \times 2 + 1 \times 1 + 0 \times 3 + (-2) \times 1 = -1 → 새 y좌표
  • 세 번째 행: 0×2+0×1+1×3+1×1=40 \times 2 + 0 \times 1 + 1 \times 3 + 1 \times 1 = 4 → 새 z좌표
  • 결과: 점 (2,1,3)(2, 1, 3)이 평행이동을 거쳐 점 (5,1,4)(5, -1, 4)가 되었다. 각 좌표에 이동량을 그대로 더한 값과 일치한다.

2. 3D 회전 — 세 개의 축, 세 개의 행렬

쉽게 말하면: 3D 회전은 회전시킬 축을 하나 고정해 두고, 나머지 두 좌표만 2D 회전처럼 돌리는 것입니다.

xx축을 기준으로 회전할 때는 xx좌표는 그대로 두고 y,zy, z좌표만 2D 회전 공식처럼 섞입니다. yy축, zz축 회전도 각각 자신의 축 좌표는 고정하고 나머지 두 좌표를 섞는 방식으로 정의됩니다.

Rx(θ)=[10000cosθsinθ00sinθcosθ00001]R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta & 0 \\ 0 & \sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Ry(θ)=[cosθ0sinθ00100sinθ0cosθ00001]R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -\sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Rz(θ)=[cosθsinθ00sinθcosθ0000100001]R_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
  • RxR_xxx좌표를 고정하고 (y,z)(y, z) 평면 안에서 회전시킨다(1행 1열이 1로 고정되고 나머지 3x3 부분이 04편의 2D 회전 행렬과 같은 구조).
  • RyR_yyy좌표를 고정하고 (z,x)(z, x) 평면에서 회전시킨다. 부호 배치가 Rx,RzR_x, R_z와 다른 이유는 x,y,zx, y, z축의 순환 순서(xyzxx \to y \to z \to x)를 따르기 때문이다.
  • RzR_zzz좌표를 고정하고 (x,y)(x, y) 평면에서 회전시키며, 04편에서 다룬 2D 회전과 사실상 같은 변환이다.

(0,1,0)(0, 1, 0)zz축 기준으로 9090도 반시계 방향 회전시켜 보겠습니다. cos90°=0\cos 90° = 0, sin90°=1\sin 90° = 1입니다.

[0100100000100001][0101]=[0×0+(1)×11×0+0×101]=[1001]\begin{bmatrix} 0 & -1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 0 \\ 1 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \times 0 + (-1) \times 1 \\ 1 \times 0 + 0 \times 1 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} -1 \\ 0 \\ 0 \\ 1 \end{bmatrix}
  • 결과: 점 (0,1,0)(0, 1, 0)zz축 기준 90도 회전을 거쳐 점 (1,0,0)(-1, 0, 0)이 되었다. zz좌표는 회전축이므로 00에서 변하지 않는다.

이번에는 같은 점 (0,1,0)(0, 1, 0)xx축 기준으로 9090도 회전시켜 비교해 보겠습니다.

[1000001001000001][0101]=[00×1+(1)×01×1+0×01]=[0011]\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 0 \\ 1 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \times 1 + (-1) \times 0 \\ 1 \times 1 + 0 \times 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ 1 \\ 1 \end{bmatrix}
  • 결과: 같은 점 (0,1,0)(0, 1, 0)인데도 xx축 기준 90도 회전에서는 (0,0,1)(0, 0, 1)이 되었다. 회전축이 다르면 같은 점이라도 완전히 다른 위치로 이동한다.
회전축고정되는 좌표회전하는 평면예시 점 (0,1,0)을 90도 회전한 결과
xxxx(y,z)(y, z)(0,0,1)(0, 0, 1)
yyyy(z,x)(z, x)(0,1,0)(0, 1, 0) (변화 없음, 이미 y축 위의 점)
zzzz(x,y)(x, y)(1,0,0)(-1, 0, 0)

자주 틀리는 점: 세 회전 행렬의 부호 위치를 서로 헷갈리는 경우가 많습니다. RxR_xRzR_zsinθ-\sin\theta가 각각 (2행 3열), (1행 2열)에 있지만, RyR_y만 예외적으로 sinθ-\sin\theta가 (3행 1열)에 있습니다. 이는 xyzxx \to y \to z \to x 순환 순서를 따르기 때문이며, 시험에서는 이 부호 위치를 정확히 외워야 계산 실수를 막을 수 있습니다.

3. 3D 스케일(Scale)

쉽게 말하면: 3D 스케일도 2D와 같은 원리로, x, y, z축 방향으로 각각 정해진 배율만큼 크기를 바꿉니다.

S(sx,sy,sz)=[sx0000sy0000sz00001]S(s_x, s_y, s_z) = \begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

(2,3,1)(2, 3, 1)sx=2,sy=1,sz=3s_x=2, s_y=1, s_z=3으로 확대해 보겠습니다.

[2000010000300001][2311]=[4331]\begin{bmatrix} 2 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 3 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \\ 1 \\ 1 \end{bmatrix} = \begin{bmatrix} 4 \\ 3 \\ 3 \\ 1 \end{bmatrix}
  • 결과: 점 (2,3,1)(2, 3, 1)이 스케일 변환을 거쳐 점 (4,3,3)(4, 3, 3)이 되었다. yy좌표는 배율이 1이라 변화가 없다.

4. 3D 합성 변환 — 순서 문제가 3D에서는 더 커진다

04편에서 확인했듯 행렬 곱셈은 교환법칙이 성립하지 않습니다. 3D에서는 회전축이 세 개나 되기 때문에 이 문제가 훨씬 두드러집니다. 특히 서로 다른 두 축을 기준으로 한 회전은 순서를 바꾸면 결과가 다릅니다.(1,0,0)(1, 0, 0)zz축 90도 회전을 먼저 적용한 뒤 xx축 90도 회전을 적용하는 경우와, 순서를 반대로 하는 경우를 비교해 보겠습니다.

순서 1: zz축 회전 후 xx축 회전. 먼저 점 (1,0,0)(1,0,0)zz축 기준 90도 회전시킵니다.

[0100100000100001][1001]=[0101]\begin{bmatrix} 0 & -1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \\ 0 \\ 1 \end{bmatrix}

이제 이 결과 (0,1,0)(0, 1, 0)xx축 기준 90도 회전시킵니다. 이는 앞서 2절에서 이미 계산한 것과 같은 식으로, 결과는 (0,0,1)(0, 0, 1)입니다.

  • “z축 회전 후 x축 회전” 순서의 최종 결과: 점 (1,0,0)(1, 0, 0) → 점 (0,0,1)(0, 0, 1)

순서 2: xx축 회전 후 zz축 회전. 먼저 점 (1,0,0)(1,0,0)xx축 기준 90도 회전시킵니다. xx좌표가 고정되는 회전이므로, xx좌표가 11이고 y,zy, z좌표가 모두 00인 이 점은 xx축 위에 있어 회전해도 그대로입니다.

[1000001001000001][1001]=[1001]\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 1 \\ 0 \\ 0 \\ 1 \end{bmatrix}

이제 이 결과 (1,0,0)(1, 0, 0)zz축 기준 90도 회전시킵니다. zz좌표가 고정되는 회전이고 이 점은 (x,y)(x, y) 평면 위의 04편 예제와 같은 점이므로, 결과는 (0,1,0)(0, 1, 0)입니다.

  • “x축 회전 후 z축 회전” 순서의 최종 결과: 점 (1,0,0)(1, 0, 0) → 점 (0,1,0)(0, 1, 0)

같은 두 회전, 같은 시작점인데도 순서를 바꾸자 결과가 (0,0,1)(0, 0, 1)(0,1,0)(0, 1, 0)으로 달라졌습니다.

비유: 정육면체 상자를 손에 들고 먼저 세로축(z축)으로 한 바퀴의 4분의 1만큼 돌린 다음 가로축(x축)으로 다시 4분의 1을 돌리는 것과, 먼저 가로축으로 돌린 다음 세로축으로 돌리는 것은 상자가 최종적으로 놓이는 방향이 다릅니다. 비행기의 롤(roll)·피치(pitch)·요(yaw) 회전을 어떤 순서로 적용하느냐에 따라 최종 자세가 달라지는 것도 같은 원리입니다.

자주 틀리는 점: “같은 축을 두 번 회전하면 순서가 상관없다”는 것과 “서로 다른 축을 회전하면 순서가 상관없다”는 것을 혼동하면 안 됩니다. 같은 축을 기준으로 한 두 회전(예: zz축으로 30도 회전 후 다시 zz축으로 60도 회전)은 각도를 더한 것과 같아 순서가 상관없지만, 서로 다른 축을 기준으로 한 회전은 일반적으로 순서를 바꾸면 결과가 달라집니다.

핵심 정리

  • 3D 변환은 (x,y,z,1)(x, y, z, 1) 동차좌표와 4×44 \times 4 행렬을 사용하며, 평행이동은 네 번째 열에, 스케일은 대각선에 값을 넣는 구조가 2D와 같다.
  • 3D 회전은 x,y,zx, y, z 세 축 중 어느 축을 기준으로 하는지에 따라 Rx,Ry,RzR_x, R_y, R_z 세 가지 행렬이 다르게 정의되며, 회전축의 좌표는 고정된다.
  • RyR_yxyzxx \to y \to z \to x 순환 순서 때문에 sinθ-\sin\theta의 위치가 Rx,RzR_x, R_z와 다르다.
  • 서로 다른 축을 기준으로 한 3D 회전은 순서를 바꾸면 결과가 달라지며, 같은 축을 두 번 회전하는 경우에만 순서가 상관없다.

마무리 복습

문제 14지선다
점 (2, 1, 3)을 tx=3, ty=-2, tz=1만큼 3D 평행이동한 결과로 가장 적절한 것은?
문제 24지선다
점 (0, 1, 0)을 z축 기준으로 90도 반시계 회전시킨 결과로 가장 적절한 것은?
문제 34지선다
3D 회전 행렬 Rx, Ry, Rz에 대한 설명으로 옳지 않은 것은?
문제 44지선다
점 (2, 3, 1)을 sx=2, sy=1, sz=3으로 3D 스케일한 결과로 가장 적절한 것은?
문제 54지선다
점 (1, 0, 0)에 z축 90도 회전을 먼저 적용한 뒤 x축 90도 회전을 적용한 결과로 가장 적절한 것은?
문제 64지선다
3D 합성 변환에서 회전 순서에 관한 설명으로 가장 적절한 것은?

참고 자료

Last updated on