Skip to Content

이번 문서의 목표: 3D 장면을 카메라 기준 좌표로 옮기는 보기 변환의 의미를 설명할 수 있고, 평행투영과 원근투영 행렬을 실제 점에 곱해 투영된 좌표를 구할 수 있으며, 두 투영 방식의 차이와 원근 나눗셈의 역할을 이해하게 된다.

왜 3D 장면을 그대로 화면에 그릴 수 없는가

모니터는 2차원 평면입니다. 3차원 공간에 놓인 물체를 화면에 그리려면, “3차원 점 하나를 2차원 평면의 어느 점에 대응시킬 것인가”를 정하는 절차가 필요합니다. 이 절차를 투영(Projection)이라고 부릅니다. 그런데 투영을 하기 전에 먼저 풀어야 할 문제가 있습니다. 지금까지 다룬 좌표는 물체가 원래 놓인 절대적인 위치(세계 좌표, world coordinate)였지만, 실제로 화면에 무엇이 어떻게 보이는지는 카메라(또는 눈)가 어디에서 어느 방향을 보고 있는지에 따라 완전히 달라집니다. 그래서 투영에 앞서 세계 좌표를 카메라를 기준으로 한 좌표로 바꾸는 보기 변환(Viewing Transformation)이 먼저 필요합니다.

쉽게 말하면: 보기 변환은 “카메라가 원점에서 정면을 보고 있다고 가정할 수 있게 좌표를 다시 잡는 것”이고, 투영은 “그 카메라가 보는 3차원 장면을 2차원 평면에 눌러 담는 것”입니다.

1. 보기 변환 — 카메라를 원점으로

쉽게 말하면: 보기 변환은 세계 전체를 카메라가 원점에 있고 정해진 방향을 보도록 통째로 옮기고 돌리는 것입니다.

일반적인 보기 변환은 카메라의 위치(eye position), 바라보는 지점(look-at point), 그리고 카메라의 위쪽 방향(up vector)이라는 세 정보로부터 회전과 평행이동을 계산해, 세계 좌표계의 모든 점을 카메라가 원점에서 특정 축(보통 z-z 또는 +z+z 방향)을 보고 있는 좌표계로 옮깁니다. 회전 부분은 07편에서 다룬 Rx,Ry,RzR_x, R_y, R_z 회전 행렬을 조합해 만들어지므로, 이번 편에서는 카메라가 회전 없이 세계 좌표축과 나란한 방향만 보고 있는 단순한 경우로 개념을 잡고, 핵심인 투영 계산에 집중합니다.

카메라가 세계 좌표 (0,0,10)(0, 0, 10)에 있고, 회전 없이 zz축 음의 방향을 향해 정면을 보고 있다고 하겠습니다. 이때 보기 변환은 카메라 위치만큼 세계 전체를 반대로 평행이동하는 것과 같습니다.

Pcamera=PworldPcamera positionP_{\text{camera}} = P_{\text{world}} - P_{\text{camera position}}
  • PworldP_{\text{world}}: 원래 세계 좌표계에서의 점
  • Pcamera positionP_{\text{camera position}}: 카메라의 세계 좌표계 위치
  • PcameraP_{\text{camera}}: 카메라를 원점으로 삼았을 때 그 점이 갖는 새 좌표

세계 좌표 (4,2,8)(4, 2, 8)에 있는 점을, 카메라 위치 (0,0,10)(0, 0, 10)을 기준으로 한 카메라 좌표로 바꿔 보겠습니다.

Pcamera=(4,2,8)(0,0,10)=(4,2,2)P_{\text{camera}} = (4, 2, 8) - (0, 0, 10) = (4, 2, -2)
  • 결과: 세계 좌표에서 카메라보다 22만큼 카메라에 가까이 있던 점(카메라의 z=10z=10보다 물체의 z=8z=8이 작음)이, 카메라 좌표계에서는 z=2z = -2가 되었다. 카메라가 zz축 음의 방향을 보고 있다는 가정에서는 zz좌표가 음수일수록 카메라 앞쪽에, 즉 실제로 보이는 위치에 있다는 뜻이 된다.

자주 틀리는 점: 보기 변환에서 평행이동량에 카메라 위치를 그대로 더하는 실수가 흔합니다. 세계 전체를 카메라가 원점이 되도록 옮기려면 카메라 위치의 반대 방향으로 옮겨야 하므로, 카메라 위치를 빼는 것이 맞습니다.

2. 평행투영(Parallel Projection) — 거리와 무관하게 같은 크기

쉽게 말하면: 평행투영은 모든 투영선을 서로 나란하게 그어 물체를 평면에 눌러 담는 방식으로, 물체가 멀리 있어도 크기가 줄어들지 않습니다.

평행투영은 물체의 각 점에서 투영면까지 서로 평행한 직선(투영선)을 그어 만나는 점을 결과로 삼습니다. 가장 단순한 형태는 zz축 방향으로 평행하게 투영선을 그어 xyxy평면(투영면)에 눌러 담는 것으로, 이 경우 단순히 zz좌표를 버리고 x,yx, y좌표만 남기면 됩니다. 동차좌표 행렬로는 다음과 같이 표현합니다.

Mparallel=[1000010000000001]M_{\text{parallel}} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
  • 세 번째 행이 전부 0이라는 것은 결과에서 zz성분을 항상 0으로 만든다는 뜻이다. 즉 zz값이 얼마든 상관없이 투영면인 z=0z=0 평면 위로 눌러 담는다.

앞서 카메라 좌표로 바꾼 점 (4,2,2)(4, 2, -2)를 평행투영해 보겠습니다.

[1000010000000001][4221]=[4201]\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 4 \\ 2 \\ -2 \\ 1 \end{bmatrix} = \begin{bmatrix} 4 \\ 2 \\ 0 \\ 1 \end{bmatrix}
  • 결과: 점 (4,2,2)(4, 2, -2)가 평행투영을 거쳐 (4,2,0)(4, 2, 0)이 되었다. x,yx, y좌표는 그대로 유지되고 zz좌표만 0이 된다.

평행투영의 가장 큰 특징은 깊이(거리)와 무관하게 크기가 유지된다는 것입니다. 만약 같은 물체가 카메라로부터 z=2z=-2가 아니라 z=20z=-20 위치에 있었다 해도, 평행투영 결과는 여전히 (4,2,0)(4, 2, 0)으로 동일합니다. 이 성질 때문에 평행투영은 건축 도면이나 기계 제도처럼 “실제 치수를 왜곡 없이 정확히 보여줘야 하는” 용도에 주로 쓰입니다.

3. 원근투영(Perspective Projection) — 멀수록 작게

쉽게 말하면: 원근투영은 우리 눈이 실제로 보는 것처럼, 멀리 있는 물체일수록 화면에 더 작게 맺히도록 계산하는 방식입니다.

원근투영은 모든 투영선이 하나의 점(투영 중심, center of projection)에서 뻗어 나가 투영면과 만나는 점을 결과로 삼습니다. 카메라(눈)가 투영 중심이고, 카메라 앞쪽 거리 dd에 투영면이 있다고 하면, 점 (x,y,z)(x, y, z)의 원근투영 결과 (x,y)(x', y')은 다음과 같이 계산됩니다.

x=xdz,y=ydzx' = \frac{x \cdot d}{z}, \qquad y' = \frac{y \cdot d}{z}
  • dd: 카메라(투영 중심)에서 투영면까지의 거리
  • zz: 점이 카메라로부터 떨어진 깊이(카메라 좌표계 기준)
  • 분모에 zz가 있다는 것이 원근투영의 핵심이다. zz(거리)가 커질수록 x,yx', y'은 작아지므로, 멀리 있는 물체일수록 화면에 작게 맺힌다.

이를 동차좌표 행렬로 표현하면 다음과 같습니다.

Mperspective=[100001000010001d0]M_{\text{perspective}} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & \frac{1}{d} & 0 \end{bmatrix}
  • 네 번째 행의 1d\frac{1}{d}가 핵심이다. 이 행렬을 동차좌표 (x,y,z,1)(x, y, z, 1)에 곱하면 네 번째 성분(동차 나눗셈에 쓰이는 ww값)이 zd\frac{z}{d}가 되고, 최종적으로 각 성분을 이 ww값으로 나누는 원근 나눗셈(perspective division)을 거쳐야 실제 좌표가 나온다.

카메라 좌표 (4,2,8)(4, 2, 8)에 있는 점을(이번에는 카메라 정면 방향을 양의 zz로 두는 간단한 경우로 계산합니다) d=4d=4인 투영면에 원근투영해 보겠습니다.

[10000100001000140][4281]=[4282]\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & \frac{1}{4} & 0 \end{bmatrix} \begin{bmatrix} 4 \\ 2 \\ 8 \\ 1 \end{bmatrix} = \begin{bmatrix} 4 \\ 2 \\ 8 \\ 2 \end{bmatrix}
  • 네 번째 성분(동차 ww값)이 84=2\frac{8}{4} = 2로 계산되었다. 이제 이 결과를 w=2w=2로 나눠 원근 나눗셈을 수행한다.
(42,22,82)=(2,1,4)\left( \frac{4}{2}, \frac{2}{2}, \frac{8}{2} \right) = (2, 1, 4)
  • 결과: 투영된 점의 좌표는 (2,1)(2, 1)이고, zz좌표는 투영면의 거리인 44로 맞춰졌다. 이는 공식 x=xd/z=4×4/8=2x' = xd/z = 4 \times 4 / 8 = 2, y=yd/z=2×4/8=1y' = yd/z = 2 \times 4 / 8 = 1로 직접 계산한 값과 정확히 일치한다.

자주 틀리는 점: 원근투영 행렬을 점에 곱한 뒤, 원근 나눗셈(네 번째 성분으로 나누는 과정)을 빠뜨리는 실수가 매우 흔합니다. 행렬을 곱한 직후의 값 (4,2,8,2)(4, 2, 8, 2)는 아직 동차좌표일 뿐이며, 반드시 네 번째 성분 22로 나머지 세 성분을 나눠야 실제 좌표 (2,1,4)(2, 1, 4)를 얻을 수 있습니다.

4. 평행투영과 원근투영 비교

구분평행투영원근투영
투영선서로 평행한 점(투영 중심)에서 방사형으로 뻗음
거리에 따른 크기 변화없음(거리와 무관하게 동일 크기)있음(멀수록 작게 보임)
계산단순 좌표 대입(나눗셈 없음)zz로 나누는 원근 나눗셈 필요
시각적 사실성낮음(실제 눈으로 보는 방식과 다름)높음(사람 눈·카메라가 보는 방식과 유사)
주요 활용기계 제도, CAD 도면, 치수 정확성이 중요한 경우게임, 영화, 사실적인 3D 렌더링

이 흐름도는 3D 그래픽스 파이프라인에서 한 점이 화면에 그려지기까지 거치는 단계를 요약합니다. 01편에서 다룬 전체 파이프라인의 뼈대 위에, 이번 편의 보기 변환·투영과 06편의 클리핑·윈도우-뷰포트 변환이 순서대로 연결되는 구조입니다.

자주 틀리는 점: 평행투영이 “원근투영보다 열등한 방식”이라고 오해하는 경우가 있습니다. 두 방식은 우열의 문제가 아니라 목적이 다릅니다. 실제 치수를 왜곡 없이 전달해야 하는 설계 도면에는 평행투영이 오히려 적합하고, 시각적 사실성이 중요한 게임·영화 렌더링에는 원근투영이 적합합니다.

핵심 정리

  • 보기 변환은 세계 좌표를 카메라가 원점에 있는 것처럼 바꾸는 절차로, 단순한 경우 카메라 위치만큼 반대로 평행이동하는 것과 같다.
  • 평행투영은 zz좌표를 0으로 만들어 눌러 담는 방식으로, 거리와 무관하게 크기가 유지된다.
  • 원근투영은 zz로 나누는 원근 나눗셈을 거쳐야 하며, 거리가 멀수록 결과 좌표가 작아져 사람 눈이 보는 방식과 비슷해진다.
  • 투영 행렬을 곱한 직후의 값은 아직 동차좌표이므로, 네 번째 성분으로 나누는 원근 나눗셈을 반드시 거쳐야 실제 좌표가 나온다.

마무리 복습

문제 14지선다
세계 좌표 (4, 2, 8)에 있는 점을 카메라 위치 (0, 0, 10) 기준의 카메라 좌표로 바꾼 결과로 가장 적절한 것은?
문제 24지선다
점 (4, 2, -2)를 z축 방향 평행투영으로 xy평면에 투영한 결과로 가장 적절한 것은?
문제 34지선다
카메라 좌표 (4, 2, 8)에 있는 점을 d=4인 투영면에 원근투영한 결과 좌표(x', y')로 가장 적절한 것은?
문제 44지선다
원근투영 행렬을 동차좌표 (4, 2, 8, 1)에 곱한 직후 얻은 (4, 2, 8, 2)에 대한 설명으로 가장 적절한 것은?
문제 54지선다
평행투영과 원근투영을 비교한 설명으로 옳지 않은 것은?
문제 64지선다
3D 그래픽스 파이프라인에서 한 점이 화면에 그려지기까지 거치는 순서로 가장 적절한 것은?

참고 자료

Last updated on