07 — 3차원 그래픽스의 기하변환과 뷰잉

출처: SSU 컴퓨터 그래픽스 슬라이드 — SSU_CG_07_3차원그래픽스의기하변환과뷰잉.pdf 주차: 6주차 — 중간고사에서 가장 큰 배점이 걸린 챕터 선행: CGP 4-1 — 3D 수학 기초 (벡터·행렬·변환)

3차원 공간에서 객체를 놓고(변환), 카메라로 담는(뷰잉·투영) 전 과정을 다룹니다. 본 강의 슬라이드는 행렬 유도 중심, 동일 주제의 OpenGL 구현은 CGP 4-2 — 좌표 공간과 투영 에서 다룹니다.


1. 3차원 그래픽스의 처리 과정

출처: 슬라이드 도입부

교과서적 파이프라인: 모델링(Modeling) → 투영(Projection) → 렌더링(Rendering).

1.1 모델링 (3D Object Representation)

  • 다각형 면 모델링 (Polygon Surface)
  • 곡면 모델링 (Surface)
  • 솔리드 모델링 (Solid)
  • 스위핑 (Sweeping) — 평면 도형을 궤적 따라 밀어 입체 생성

1.2 투영 (Projection)

  • 평행 투영: 투영선이 서로 평행. 거리와 무관하게 크기 유지 → CAD·설계 도면.
  • 원근 투영: 투영선이 한 점(시점)으로 수렴. 실감 있는 화면.

1.3 렌더링 (Rendering)

은면 제거, 셰이딩, 텍스처 매핑 등이 포함됩니다. (셰이딩·텍스처는 기말 범위)

1.4 기타 3D 디스플레이 기법

  • 깊이 표시법 (Depth Cueing): 와이어프레임에서 뒤쪽 선을 어둡게·점선으로 처리.
  • 분해도 (Exploded view): 부품을 공간에 펼쳐 조립 관계 표현.
  • 단면도 (Cutaway view): 일부를 잘라내 내부 구조 공개.

2. 기본적인 3차원 기하 변환

출처: 슬라이드 1~9

동차좌표계 기반 4×4 행렬.

2.1 이동 (Translation)

2.2 신축 (Scaling) — 원점 기준

임의의 점 기준 신축:

2.3 회전 (Rotation) — 좌표축 기준 ⭐️

Z축 회전 (2D 회전과 동일, xy 평면에서 회전):

X축 회전 (yz 평면에서 회전):

Y축 회전 (zx 평면에서 회전 — sin 부호 주의):

만 부호가 반대인가: 오른손 좌표계에서 순환 방향(X→Y→Z)을 유지하기 위함. Y축 회전은 "Z→X" 방향으로 읽어야 일관됨. 아래 시각화로 세 축을 직접 비교해 보세요.

3D 축별 회전 — X→Y→Z 사이클과 Y축 부호

6주차
34°
Ry (Y축 회전)Z → X
회전 평면: ZX 평면 (부호 반대)
0.83      0    0.56    0
  0       1       0      0
−0.56    0   0.83    0
  0       0       0      1
왜 Ry 만 부호가 반대?
순환을 유지하려면 "Z → X" 로 읽어야 하는데, 행렬 인덱스는 X 가 앞 → 부호 뒤집혀 보임.
Rx : Y → Z (사이클 +)
Ry : Z → X (사이클 +, 인덱스 −)
Rz : X → Y (사이클 +)
오른손 좌표계의 X → Y → Z → X 순환은 세 회전 모두 공통. 하지만 행렬에서는 항상 "작은 인덱스 행 → 큰 인덱스 행" 순으로 쓰기 때문에, 사이클상 Z → X (Z가 먼저) 로 읽혀야 할 Ry 만 두 sin 항의 위치가 뒤바뀌고, 그래서 부호가 뒤집혀 보이는 것. 수학적으로는 같은 "오른손 회전"이지만 표기법이 다를 뿐.

참고: 2D 회전 행렬이 sin/cos 으로 구성되는 근본 이유는 05 — 2D 변환 2.3절RotationUnitCircle 에서 유도됩니다. 3D 축별 회전은 이 2D 행렬을 해당 평면에 끼워 넣은 것.

2.4 임의의 회전축에 대한 회전 — 5단계 샌드위치

  1. 회전축이 원점을 지나도록 이동.
  2. 회전축이 주 좌표축(예: z축)과 일치하도록 회전.
  3. 일치된 좌표축을 중심으로 원하는 각도 회전.
  4. 과정 (2) 의 역 회전.
  5. 과정 (1) 의 역 이동.

2.5 회전 순서의 비교환성 ⭐️

X, Y, Z 축을 순차적으로 회전시킬 때 순서를 바꾸면 결과가 달라진다 — 행렬 곱은 교환법칙을 따르지 않기 때문(). 아래 세 큐브의 회전각은 모두 동일하지만 적용 순서만 다릅니다.

회전 순서의 비교환성 — 같은 각도, 다른 순서

6주차
X → Y → ZX축 먼저
Z → Y → X반대 순서
Y → X → Z섞은 순서
60°
45°
30°
세 큐브의 각도는 정확히 같다 — X=60°, Y=45°, Z=30°. 그런데 자세가 다른 이유는 적용 순서 때문. 행렬 곱이 교환법칙을 따르지 않으므로 (Rx·Ry ≠ Ry·Rx), 오일러 각으로 자세를 표현할 땐 반드시 "어느 순서로 곱할지" 를 명시해야 함. 엔진마다 관례가 다른 이유 (Unity=ZXY, Unreal=ZYX, Three.js 기본=XYZ).

2.6 짐벌 락 (Gimbal Lock) ⭐️

오일러 각으로 자세를 표현할 때 두 회전축이 일치해 한 차원의 자유도를 잃는 현상.

예: 적용 후 원래 X 축이 Z 축 방향으로 회전해 버려, 이후의 , 가 같은 축을 도는 효과가 됩니다. 애니메이션이 부자연스럽게 튀는 원인이며, 4차원 hypercomplex 체계인 쿼터니언(Quaternion) 으로 해결합니다.

짐벌 락 (Gimbal Lock)

6주차
⚠ Gimbal Lock — Yaw와 Roll 축이 일치
90°
Pitch 접근도
100%
자유도
2 (축 상실)
Pitch 를 **±90°** 근처로 옮기면 **Yaw**와 **Roll** 의 회전축이 같은 방향을 가리키게 됩니다. 결국 3개의 축을 제어해도 실질적으로 2축만 움직이는 **자유도 상실** 이 발생 — 이 문제를 해결하려고 쿼터니언이 등장했습니다.

3. 기타 3차원 기하 변환

3.1 반사 (Reflection)

음의 Scale 또는 회전각이 180°인 특수 회전으로도 해석 가능.

xy평면 기준 반사 (z 성분 뒤집음):

마찬가지로 xz 평면 → , yz 평면 → .

3.2 밀림 (Shearing)

모양은 바꾸나 부피는 보존. 3차원 투영·뷰잉에서 매우 중요한 역할.

Z축 기준 밀림 — a, b는 x, y 방향으로 밀리는 비율:

3.3 좌표계의 변환 (Coordinate Transformation)

객체를 고정시키고 좌표계를 변환 시켜도 객체를 변환시킨 것과 동등한 효과.

  • 좌표계를 반대 방향으로 이동·회전 = 객체를 원래 방향으로 이동·회전.
  • 좌표축 확대 = 객체 축소.

왜 중요한가: 자동차 같은 복합 모델에서 앞바퀴 좌표계, 차체 좌표계, 월드 좌표계 가 따로 있고, 이들 사이를 오가며 계층적 애니메이션을 만들기 때문. 뷰잉 변환 도 결국 "카메라 좌표계로 세계를 재해석" 하는 좌표계 변환입니다.

3.4 오른손 좌표계 vs 왼손 좌표계 ⭐️

좌표계특징
오른손 좌표계 (Right-handed)화면 앞으로 나올수록 z값이 커짐 — 수학 관례, OpenGL
왼손 좌표계 (Left-handed)화면 앞으로 나올수록 z값이 작아짐 — 일부 DirectX

이 차이가 뷰 변환·원근 투영 공식에서 z의 부호 관례를 결정합니다.


4. 투영의 개념과 종류

출처: 슬라이드 15~19

3D 물체를 2D 평면에 표현하려고 3D 모델 좌표를 2D 평면 좌표로 변환합니다.

Camera Viewing & Projection

6주차
World View (drag to orbit)
Camera View
50°
1.50 : 1
1.0
10.0
Near ~ Far 평면 사이의 물체만 렌더링됩니다. 왼쪽 World View 에서 카메라 시야 부피(프러스텀 / 직육면체)가 노란 와이어프레임으로 표시됩니다. 오른쪽은 실제 카메라가 보는 장면.

4.1 평행 투영 (Parallel Projection)

투영선이 서로 평행. 세 가지 하위 분류:

직각 투영 (Orthographic Projection)

투영각이 투영면과 직각 인 경우. 물체의 길이와 각도가 정확히 표시되므로 기계·건축 제도 에 적합. 점 가 투영면(z=0)에 직각 투영:

등축 투영 (Axonometric Projection)

투영면이 축과 직각이 아닌 방향. 3면을 동시에 보여주는 120°/120°/120° 각도.

경사 투영 (Oblique Projection)

평행 투영이지만 투영 방향이 투영면과 수직이 아니고 일정 각도 를 이룸.

4.2 원근 투영 (Perspective Projection) ⭐️

공간상의 객체와 투영중심점(시점) 을 연결하여 투영면에 표현. 거리에 따라 크기가 달라져 훨씬 실감 나는 화면.

시점 , 투영면 에 점 를 원근 투영:

즉 x, y 는 반비례 → 시점에서 멀리 떨어질수록 작아집니다.


5. 뷰잉 변환 — UVN 좌표계

출처: 슬라이드 10~14

5.1 3차원 뷰잉 과정

  1. 모델링 변환: 모델좌표계의 3D 객체를 월드좌표계로 가져옴.
  2. 뷰잉 변환: 월드좌표계의 객체를 뷰잉좌표계로 변환.
  3. 투영 변환: 뷰잉좌표계의 객체를 2차원 뷰평면에 투영.
  4. 윈도우-뷰포트 변환: 투영 결과를 장치좌표계(실제 화면)로 변환.

5.2 뷰잉 좌표계의 설정

투영 처리를 용이하게 하기 위해 월드좌표계를 뷰잉좌표계로 변환합니다. 이때 투영면이 z=0 인 xy 평면 이 되도록.

요소의미
VRP (View Reference Point)원점 — 뷰평면 상의 한 점
VPN (View Plane Normal)Normal Vector — z축 에 해당
VUP (View Up Vector)Up Vector — y축 에 해당 (x축은 자동 결정)

5.3 UVN 기저 생성 — LookAt 방식 ⭐️

Eye(카메라 위치), At(바라보는 지점), Up(위쪽) 으로부터: (바라보는 방향의 반대, +z) (오른쪽 방향, +x) (카메라의 실제 위쪽, +y)

본질적으로 VRP↔Eye, VPN↔n, VUP↔v 의 대응. 두 표기법 어느 쪽으로 시험에 출제되어도 같은 개념.

Eye 위치를 움직여 보면 UVN 세 축이 카메라에 어떻게 자동으로 붙는지 보입니다.

LookAt — Eye·At·Up 에서 UVN 기저 유도

7주차
Eye 위치 (At=(0, 0.5, 0) 고정)
3.0
2.0
4.0
유도 (LookAt)
Eye = (3.00, 2.00, 4.00)
At = (0.00, 0.50, 0.00)   Up = (0.00, 1.00, 0.00)
n = (Eye − At) / |..|
= (0.57, 0.29, 0.77)
u = (Up × n) / |..|
= (0.80, 0.00, -0.60)
v = n × u
= (-0.17, 0.96, -0.23)
u 우측
v
n 시선 역방향
LookAt 의 직관: "카메라가 어디 있고(Eye), 어디를 보고(At), 어느 쪽이 위인가(Up)" 만 주면 카메라의 세 축이 자동으로 정해진다. n = Eye−At 이 "카메라가 바라보는 반대 방향" (OpenGL 컨벤션에서 카메라는 -z 를 봄) 이므로 n 은 +z. u 는 Up 과 n 에 모두 수직인 우측 방향, v 는 n × u 로 카메라의 실제 위. 뷰 행렬은 이 u, v, n 을 XYZ 축에 정렬시키는 회전 + 카메라를 원점으로 이동.

5.4 월드좌표계 → 뷰잉좌표계 변환 (5단계)

객체의 기하변환 대신 좌표계 변환을 적용.

  1. 뷰잉좌표계가 주어짐.
  2. 뷰잉좌표계 원점을 월드좌표계 원점과 일치하도록 이동.
  3. 월드좌표계 X축 중심으로 뷰잉좌표계 회전 — z축이 월드 zx 평면에 위치.
  4. 월드좌표계 Y축 중심으로 회전 — 두 좌표계의 z축 일치.
  5. 월드좌표계 Z축 중심으로 회전 — 뷰잉좌표계와 월드좌표계 완전 일치.

6. 투영을 위한 변환 — 프러스텀 정규화 ⭐️

출처: 슬라이드 20~22

6.1 뷰볼륨 (View Volume)

뷰평면의 윈도우 내에 투영되는 공간상의 일정 영역.

  • 평행 투영: 평행 뷰볼륨 = 직육면체 (Box).
  • 원근 투영: 프러스텀 (Frustum) = 잘린 사각뿔.

뷰볼륨을 직육면체 형태로 변환 하여 직각 투영을 이용하면, 투영과 클리핑이 매우 간단 해집니다.

6.2 정규화된 뷰볼륨 (Canonical View Volume)

모든 좌표를 01 또는 -11 사이로 표현한 정육면체. 장치좌표계 변환·클리핑 단순화. 현대 그래픽스의 Clip Space = NDC 와 동일 개념.

6.3 평행 투영 행렬

직각 투영 행렬

z 성분을 0으로 만드는 것이 핵심.

경사 투영 행렬 — 밀림 적용

경사 투영은 점 으로 투영. 각도 , 에 의해:

6.4 원근 투영 행렬 — 프러스텀에서 정규화된 뷰볼륨으로

프러스텀 뷰볼륨 → 정규화 뷰볼륨 변환은 세 단계의 합성. 설정: 시점 원점, 앞평면 , 뒷평면 , 윈도우 대각 꼭지점 , .

과정 1: 밀림 (Shear) — 경사 원근 → 직각 원근

프러스텀의 축을 축에 정렬.

과정 2: 신축 (Scale) — 직각 원근을 45° 원근으로

시점에서 바라본 각도를 정규화.

과정 3: 정규화 (Normalization) — 45° 원근 → 정규화 평행 뷰볼륨

마지막 행 [0, 0, -1, 0]원근 분할(Perspective Divide) 의 재료 를 만들어 냅니다.

최종 원근 투영 행렬

로 나누면(원근 분할) 정규화된 좌표가 얻어집니다.

WebGL/OpenGL 의 perspective() 는 이 세 단계를 한 행렬로 합성한 결과를 돌려줍니다. 파라미터는 fovy, aspect, near, far. 구현은 CGP 4-2 — 좌표 공간과 투영 참고.

6.5 클리핑

정규화된 뷰볼륨 위에서 6개 평면 (Near, Far, Left, Right, Top, Bottom) 에 대해 수행. 모든 평면이 축정렬이라 −1 ≤ x, y, z ≤ 1 한 줄 검사로 끝.


📝 Knowledge Check: 3D 변환·뷰잉

Quiz

3D Transform · Viewing

Q 1 / 8

3차원 Y축 회전 행렬에서 sin 성분의 부호가 X축·Z축과 다른 이유는?


🔗 다음 학습