3차원 그래픽스의 기하변환·뷰잉·은면 제거
수업 6~7주차 통합. 3차원 공간에서 객체를 놓고(변환), 카메라로 담고(뷰잉·투영), 화면에 그리기 전에 가려진 면을 걸러내는(은면 제거) 전 과정을 다룹니다. 중간고사의 가장 많은 배점 이 걸린 장.
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차원 기하 변환
동차좌표계 기반 4×4 행렬.
2.1 이동 (Translation)
2.2 신축 (Scaling) — 원점 기준
임의의 점 기준 신축:
2.3 회전 (Rotation) — 좌표축 기준 ⭐️
Z축 회전 (2D 회전과 동일, 2D xy 평면에서 회전):
X축 회전 (Y, Z 평면에서 회전):
Y축 회전 (Z, X 평면에서 회전 — sin 부호 주의):
왜 만 부호가 반대인가: 오른손 좌표계에서 순환 방향(X→Y→Z)을 유지하기 위함. Y축 회전은 "Z→X" 방향으로 읽어야 일관됨.
2.4 임의의 회전축에 대한 회전 — 5단계 샌드위치
- 회전축이 원점을 지나도록 이동.
- 회전축이 주 좌표축(예: z축) 중 하나와 일치하도록 회전.
- 일치된 좌표축을 중심으로 원하는 각도 회전.
- 과정 (2) 의 역 회전.
- 과정 (1) 의 역 이동.
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. 투영의 개념과 종류
3D 물체를 2D 평면에 표현하려고 3D 모델 좌표를 2D 평면 좌표로 변환합니다.
🎥 Camera Viewing & Projection
Real-time Frustum & Projection Simulator
4.1 평행 투영 (Parallel Projection)
투영선이 서로 평행. 세 가지 하위 분류:
직각 투영 (Orthographic Projection)
평행 투영을 할 때 투영 각이 투영면과 직각 이 되는 경우. 물체의 길이와 각도가 정확히 표시되므로 기계·건축 제도 에 적합. 임의의 점 가 투영면(z=0)에 직각 투영:
등축 투영 (Axonometric Projection)
투영면이 축과 직각이 아닌 방향으로 위치. 3면을 동시에 보여주는 120°/120°/120° 각도.
경사 투영 (Oblique Projection)
평행 투영이지만 투영 방향이 투영면과 수직이 아니고 일정 각도 를 이룸. 예: 45°, 60° 각도.
4.2 원근 투영 (Perspective Projection) ⭐️
공간상의 객체와 투영중심점(시점) 을 연결하여 투영면에 표현. 거리에 따라 크기가 달라져 훨씬 실감 나는 화면을 얻습니다.
시점 , 투영면 에 임의의 점 를 원근 투영하면:
즉 x, y 는 에 반비례 → 시점에서 멀리 떨어질수록 값이 작아집니다.
5. 뷰잉 변환
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축은 자동 결정) |
구현 관점에서는 LookAt(Eye, At, Up) 의 Eye→VRP, (Eye-At)→VPN, Up→VUP 에 대응. 본질이 같은 개념.
5.3 월드좌표계 → 뷰잉좌표계 변환 (5단계)
객체의 기하변환 대신 좌표계 변환을 적용.
- 뷰잉좌표계가 주어짐.
- 뷰잉좌표계 원점을 월드좌표계 원점과 일치하도록 이동.
- 월드좌표계 X축 중심으로 뷰잉좌표계 회전 — 뷰잉좌표계 z축이 월드 zx 평면에 위치.
- 월드좌표계 Y축 중심으로 회전 — 두 좌표계의 z축 일치.
- 월드좌표계 Z축 중심으로 회전 — 뷰잉좌표계와 월드좌표계 완전 일치.
6. 투영을 위한 변환
6.1 뷰볼륨 (View Volume)
뷰평면의 윈도우 내에 투영되는 공간상의 일정 영역.
- 평행 투영: 평행 뷰볼륨 = 직육면체 (Box).
- 원근 투영: 프러스텀 (Frustum) = 잘린 사각뿔.
뷰볼륨을 직육면체 형태로 변환 하여 직각 투영을 이용하면, 투영과 클리핑이 매우 간단 해집니다.
6.2 정규화된 뷰볼륨 (Canonical View Volume)
모든 좌표를 01 또는 -11 사이로 표현한 정육면체 형태. 장치좌표계로의 변환이 용이하고, 클리핑 과정이 매우 단순화됩니다. 현대 그래픽스의 Clip Space = Normalized Device Coordinates 와 동일 개념.
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 네 개.
7. 은면 제거 (Hidden Surface Removal)
7.1 은면제거의 목적
실감 있는 그림 생성. 두 관련 개념:
- 은선 제거 (Hidden Line Removal): 와이어프레임의 보이지 않는 선을 숨김.
- 은면 제거 (Hidden Surface Removal): 가려진 면을 걸러냄.
7.2 알고리즘의 두 가지 분류 ⭐️
수업이 중간고사에서 강조하는 큰 틀.
| 분류 | 작동 단위 | 예시 |
|---|---|---|
| 객체공간법 (Object Space Method) | 공간상 객체의 위치 관계 비교 | 후면 제거, 깊이 정렬 |
| 이미지공간법 (Image Space Method) | 투영된 픽셀 평면 에서 조사 | Z-버퍼, 레이캐스팅 |
7.3 처리 개념
객체가 가진 성질(주로 거리 정렬) 을 이용해 알고리즘 효율을 높입니다.
- 객체 표면을 거리에 따라 정렬(Sorting) 한 뒤 투영면에 가까운 면을 선택해 그림.
- 포함영역 (Extent) 을 이용해 비교 회수를 줄임: 객체의 bounding box 같은 단순한 모양끼리 먼저 비교.
7.4 후면 제거 (Back-Face Removal) ⭐️
은면 제거의 첫 단계 로 이용되는, 빠르고 간단한 객체공간 방법. 일반적인 장면에서 다면체 면의 약 50% 를 제거 해 주는 효과.
평면 방정식: 에서 법선 벡터 .
판별:
- 시선 벡터 와 이면 후면 (back-facing), 이면 전면 (front-facing).
- 특히 V가 -z 축 방향과 일치하면 C < 0 이면 뒷면.
수치 예시
- 면 A: , 시선 : → front facing (카메라 향함)
- 면 B: , : → back facing (카메라 등짐)
이 예시는 수업 슬라이드의 컨벤션에 맞춘 것. "V가 카메라→물체 시선" 이냐 "물체→카메라" 냐에 따라 부호 해석이 뒤집히니 문제마다 확인 필수.
7.5 깊이 정렬 (Depth Sorting) — 페인터 알고리즘
다각형면을 깊이(z값) 에 따라 정렬한 뒤 먼 것부터 투영 하여 그림. 뒤쪽 면은 나중에 그린 앞쪽 면에 덮여 자연스럽게 가려짐.
수행 과정 (7단계) ⭐️
- z 영역이 겹치지 않으면 멀리 있는 면부터 그린다.
- z가 겹치면, x 방향으로 겹치지 않으면 각각 그린다.
- 투영하려는 면 이 겹치는 의 뒤에 있으면 부터 그린다.
- 투영하려는 의 앞에 겹치는 가 위치하면 부터 그린다.
- 투영하려는 이 겹치는 를 완전히 가리면 순서로 그린다.
- 3개 이상 겹치는 경우 각각 2개씩 비교하여 순서 결정 (재배치).
- 위 경우에 해당 없으면 일부 다각형면을 절단 하여 다시 적용.
문제점: 서로 꼬리를 물고 겹치거나(Cyclic Overlap), 복잡하게 교차하는 장면에서 절단이 많이 필요 → 계산량 급증.
7.6 Z-버퍼 (Z-Buffer) 알고리즘 ⭐️
가장 일반적으로 사용되는 이미지공간 접근법. 깊이 버퍼 (Depth Buffer) 알고리즘.
- 물체의 가시성을 픽셀 단위 로 조사.
- z 값이 가장 앞쪽인 평면의 색을 그린다.
- 두 개의 버퍼가 필요: z값을 저장하는 Z-버퍼(깊이 버퍼) + 색상을 저장하는 프레임 버퍼.
알고리즘
단계 1) 모든 픽셀 (x, y) 에 대해
Depth(x, y) = -∞
Frame(x, y) = 배경의 색상값(Intensity)
단계 2) for each polyhedron do
for each 3D surface S do
for each point P do
if z-coord(P) > Depth(x, y) {
Depth(x, y) ← z-coord(P)
Frame(x, y) ← Intensity(P)
}
수업 컨벤션 주의: 수업은 큰 z값 = 앞쪽 으로 취급. 초기값 , 더 큰 값 발견 시 갱신. (OpenGL은 관례가 반대로 "작은 z = 앞" 을 쓰므로 교재마다 부호가 달라질 수 있음 — 시험 문제에서 주어진 컨벤션을 따르세요.)
특징
- 일반 곡면에 대해서도 적용 가능.
- 구현이 간단 하며 다각형 면에 대한 정렬이 필요 없음.
- 추가 버퍼(메모리) 저장 공간 이 필요.
- 그리는 순서와 무관하게 항상 올바른 가시성 보장.
7.7 레이캐스팅 (Ray-Casting) 기법
시점에서 투영면의 각 픽셀을 통해 광선(Ray) 을 투사, 이 광선과 처음으로 만나는 객체를 선택하여 해당 픽셀을 그린다. 임의의 곡면 같은 표면에서도 효과적인 은면 제거 방법.
Z-버퍼와의 비교
- Z-버퍼: 면의 깊이 를 비교하여 처리 (객체를 픽셀로 변환 후 깊이 테스트).
- 레이캐스팅: 처음 만나는 면만 선택하여 픽셀 단위로 처리 (픽셀에서 광선을 거꾸로 쏨).
Rasterization과 Ray Tracing 의 개념적 차이 역시 동일한 구도.
수행 과정
① 광선 벡터 구하기. 광선 가 시점 를 지나고 가 광선의 단위벡터이면:
( 는 실수, 는 투영면의 픽셀 위치.)
② 광선과 객체의 교점 을 구하면 값이 결정. 가장 작은 s(가장 가까운 면) 만 그린다.
③ 임의의 모양을 가진 면은 교점 구하기가 어려움 → 객체를 포함하는 확장영역(Extent) 으로 사전 필터링해 속도 향상.
반사·굴절·그림자를 위해 광선을 재귀적으로 쏘면 레이 트레이싱(Ray Tracing) 이 됩니다 (기말 범위).
📝 Knowledge Check: 3D 변환·뷰잉·은면 제거
3D Transform · Viewing · HSR
3차원 Y축 회전 행렬에서 sin 성분의 부호가 X축·Z축과 다른 이유는?
🔗 다음 학습
- 이전: 2D 기하 변환과 클리핑 (5주차)
- 시험 대비: 중간고사 완벽 가이드 — 손으로 푸는 수치 문제 집중.