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단계 샌드위치

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

World Space (Observer)
Camera View
Field of View50°
Aspect Ratio1.50:1
Near
Far
"Near와 Far Plane 사이의 물체만 렌더링됩니다. 이 범위를 벗어나면 Clipping 처리되어 사라집니다."

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차원 뷰잉 과정

  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축은 자동 결정)

구현 관점에서는 LookAt(Eye, At, Up) 의 Eye→VRP, (Eye-At)→VPN, Up→VUP 에 대응. 본질이 같은 개념.

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

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

  1. 뷰잉좌표계가 주어짐.
  2. 뷰잉좌표계 원점을 월드좌표계 원점과 일치하도록 이동.
  3. 월드좌표계 X축 중심으로 뷰잉좌표계 회전 — 뷰잉좌표계 z축이 월드 zx 평면에 위치.
  4. 월드좌표계 Y축 중심으로 회전 — 두 좌표계의 z축 일치.
  5. 월드좌표계 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단계) ⭐️

  1. z 영역이 겹치지 않으면 멀리 있는 면부터 그린다.
  2. z가 겹치면, x 방향으로 겹치지 않으면 각각 그린다.
  3. 투영하려는 면 이 겹치는 뒤에 있으면 부터 그린다.
  4. 투영하려는 앞에 겹치는 가 위치하면 부터 그린다.
  5. 투영하려는 이 겹치는 완전히 가리면 순서로 그린다.
  6. 3개 이상 겹치는 경우 각각 2개씩 비교하여 순서 결정 (재배치).
  7. 위 경우에 해당 없으면 일부 다각형면을 절단 하여 다시 적용.

문제점: 서로 꼬리를 물고 겹치거나(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 변환·뷰잉·은면 제거

Quiz

3D Transform · Viewing · HSR

Q 1 / 13

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


🔗 다음 학습