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주차0.83 0 0.56 0 0 1 0 0 −0.56 0 0.83 0 0 0 0 1
참고: 2D 회전 행렬이 sin/cos 으로 구성되는 근본 이유는 05 — 2D 변환 2.3절 의
RotationUnitCircle에서 유도됩니다. 3D 축별 회전은 이 2D 행렬을 해당 평면에 끼워 넣은 것.
2.4 임의의 회전축에 대한 회전 — 5단계 샌드위치
- 회전축이 원점을 지나도록 이동.
- 회전축이 주 좌표축(예: z축)과 일치하도록 회전.
- 일치된 좌표축을 중심으로 원하는 각도 회전.
- 과정 (2) 의 역 회전.
- 과정 (1) 의 역 이동.
2.5 회전 순서의 비교환성 ⭐️
X, Y, Z 축을 순차적으로 회전시킬 때 순서를 바꾸면 결과가 달라진다 — 행렬 곱은 교환법칙을 따르지 않기 때문(). 아래 세 큐브의 회전각은 모두 동일하지만 적용 순서만 다릅니다.
회전 순서의 비교환성 — 같은 각도, 다른 순서
6주차Rx·Ry ≠ Ry·Rx), 오일러 각으로 자세를 표현할 땐 반드시 "어느 순서로 곱할지" 를 명시해야 함. 엔진마다 관례가 다른 이유 (Unity=ZXY, Unreal=ZYX, Three.js 기본=XYZ).2.6 짐벌 락 (Gimbal Lock) ⭐️
오일러 각으로 자세를 표현할 때 두 회전축이 일치해 한 차원의 자유도를 잃는 현상.
예: 적용 후 원래 X 축이 Z 축 방향으로 회전해 버려, 이후의 , 가 같은 축을 도는 효과가 됩니다. 애니메이션이 부자연스럽게 튀는 원인이며, 4차원 hypercomplex 체계인 쿼터니언(Quaternion) 으로 해결합니다.
짐벌 락 (Gimbal Lock)
6주차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주차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차원 뷰잉 과정
- 모델링 변환: 모델좌표계의 3D 객체를 월드좌표계로 가져옴.
- 뷰잉 변환: 월드좌표계의 객체를 뷰잉좌표계로 변환.
- 투영 변환: 뷰잉좌표계의 객체를 2차원 뷰평면에 투영.
- 윈도우-뷰포트 변환: 투영 결과를 장치좌표계(실제 화면)로 변환.
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주차5.4 월드좌표계 → 뷰잉좌표계 변환 (5단계)
객체의 기하변환 대신 좌표계 변환을 적용.
- 뷰잉좌표계가 주어짐.
- 뷰잉좌표계 원점을 월드좌표계 원점과 일치하도록 이동.
- 월드좌표계 X축 중심으로 뷰잉좌표계 회전 — z축이 월드 zx 평면에 위치.
- 월드좌표계 Y축 중심으로 회전 — 두 좌표계의 z축 일치.
- 월드좌표계 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 변환·뷰잉
3D Transform · Viewing
3차원 Y축 회전 행렬에서 sin 성분의 부호가 X축·Z축과 다른 이유는?
🔗 다음 학습
- 이전: CGP 4-1 — 3D 수학 기초
- 다음 (보조): CGP 4-2 — 좌표 공간과 투영, GLSL — 같은 주제의 OpenGL 구현 관점.
- 다음 (본강): 09 — 은면 제거 (7주차)