[Computer Graphics] 5. Projection

Lern-Backup·2021년 10월 15일
0

Computer Graphics

목록 보기
5/5

Projection

  • Viewing Transformation
  • 투영 / 투상

Viewport

  • Center of Projection (COP)
  • Origin of VCS

Projectors

  • 투상선

Line of Sight

  • 시선
  • 카메라가 바라보는 방향
  • Z-axis of VCS

Projection plane

  • View plane

1. 평행 투상

Parallel Projection

시점은 무한히 먼 곳에 있다고 가정

  • Orthographic, Axonometric, Oblique projections (직교, 축측, 경사투영)
  • Prarllel projectors 평행 프로젝터
  • 투사 후 물체의 크기 및 평행선 유지

Orthographic Projection 직교 투영

  • 주평면이 평행 (x-y, y-z, z-x)
  • 정면도, 좌측면도, 평면도
  • object의 정점처리, 조망권 설계, 설계도면 활용
  • 물체의 추상면이 평행해 3가지 view만 볼 수 있음 (동시에 보기 X)

Axonometric Projection 축측 투영

  • projection plane과 주평면이 평행하지 않음
  • 정면과 측면을 동시에 볼 수 있음

교차한 각도 투상영과 주평면 사이 교차 각도 가지고 같은지 판별

  • Isometric : 세 각이 모두 같음
  • Dimetric : 각 2개만 같음
  • Trimetric : 각이 다 다름


2. 원근 투상

Oblique Projection

  • 투영자가 투영에 직교하지 않고 평행함

  • Oblique projection이 game에 적용된 모습
  • 동시에 여러 방향이 보이고 입체적으로 보이기에 게임에서 많이 쓰임

Perspective Projection

  • 원근 투영

시점은 유한한 거리에 있다고 가정

  • projectorsd의 방향은 viewpoint
  • 애니메이션이나 게임에서의 원근감을 제공

Depth Feeling 원근 투영

  • 물체의 크기는 같지만 거리에 비례에 달라 보임

Vanishing point 소실점

  • perspective projection(원근 투영) 결과로 평행선이 만나는 지점
  • 현실은 1개의 점이 보이지만 가상으로는 여러개의 점을 만들 수 있음

Perspective Transformation

  • 직선과 평면은 그대로 유지
  • 거리에 따라 정점 축소됨 ➡ 축소비율 증가

1. 지엘의 평행 투상

GL Parallel Projection

Parallel Projection Transformation

  • glMatrixMode(GL_PROJECTION);
  • 원래 점의 z값에 대한 정보 사라짐 (역변환 X)

1-1. 정규화 가시 부피에 의한 투상

View Volume

  • 카메라가 바라보는 공간
  • 카메라에 의해 정의되는 3D 공간, 내부 물체를 스크린에 잘라내고 투사하고 래스터화해야 함
  • 근접 및 원거리 클리핑면 (앞면, 뒷면)

glOrtho(left, right, bottom, top, near, far);

  • 6면체의 가시부피
  • left, right, bottom, top : x, y 좌표값
  • near, far : 중심에서 얼마나 떨어져있는지 (VCS 원점으로부터의 거리, 양수)
  • z 좌표, near, far planes : -1 곱함

Normalized View Volume

NVV

  • 사용자 정의 VV가 크기가 2인 단위 큐브인 정규화된 VV로 확장
  • 좌표계 사용, z축 역전
  • clipping 좌표계 (CCS) LHS ⬅ 절단 좌표계

NVV를 사용하는 이유

  • 투사방식에 상관없이 손쉬운 클리핑 계산
  • 다양한 viewport로 전환 쉬움

RHCS vs LHCS

Right-handed CS

  • Rotation direction CCS
  • OpenGL NVV 전

Left-handed CS

  • Rotation direction CW
  • OpenGL NVV 후
  • Unity ⭐

NVV Transformation


(1) Translate : 중심을 옮김, 중심을 0, 0, 0으로 변환

VCS center [(r + l)/2, (t + b)/2, -(f + n)/2] to CCS origin[0, 0, 0]

(2) Scale : 가로세로 높이를 2로 바꿔줌

Width (r - l), Height (t - b), Depth (f - n) to 2

(3) Reflect : z축이 반대가 됨, 좌표계 뒤집음

Z value reflection

ex) Translation : L = -1, R = 5

  • -(L + R)/2 = -(1 + 5)/2 = -2 ➡ 왼쪽으로 2만큼 움직임

    ex) Scaling on x-axis
  • 2/(R - :) 2/(5 + 1) = 2/6 ➡ width를 1/3으로 스케일링

2. 지엘의 원근 투상

GL Perspective Projection

  • P(x, y, z) ➡ P'(x', y', d)
  • x' : d = x : z
  • y' : d = y : z


2-1. 정규화 가시 부피에 의한 투상

View Frustum

  • perspective projection을 위한 3D viewing space

Perspective Projection


View Volume

  • 뷰 볼륨에 의해 클리핑
  • 뷰 볼륨을 제어하여 개체 팝핑 효과

View Frustum to NVV

  • 원근투영 함수
  • glFrustum(left, right, bottom, top, near, far);
  • 더 쉬운 클리핑 계산을 위해 NVV로 변환
  • glFrustum(left, right, bottom, top, near, far);
    ➡ z축과 대칭이 아닐 수 있음
  • (a) > (b) : x축을 중심으로 정렬하는 shearing transformation
    ➡ [(r + l)/2, (t + b)/2, -n] to [0, 0, -n]
  • (b) > (c) : 평면 부근을 정사각형(2n*2n)으로 만드는 Scaling transformation
  • (c) > (d) : 정규화 VV로서의 perspective transformation

NVV Transformation Matrix

  • Shearing (Sh)
  • Scaling (S)
  • Perspective transformation (T)

Perspective Transformation

  • Perspective projection effect

  • Perspective transformation matrix (T)
    ➡ z값은 원근값 변환에 의해 영향 받음

  • non-linaer transformation으로 인한 거리 간격 점차 감소

  • z-buffer을 제어하기 위해 앞면 자르기 평면에 가까운 곳에 물체 배치 처리


gluPerspective

  • gluPerspective(FOV, aspect, near, far);
  • FOV : Y축의 시야각 (0~180도)
  • 측면 : w/h
  • near, far : 원점에서 양수 거리
  • gluFrustum과 달리 z축 대칭

3. 투상 파이프라인

OpenGL Pipeline

  • object의 정점의 좌표가 계속 다른 좌표계로 이동

1. 뷰 포트 설정

Viewport Transformation

Perspective Division (원근 분할)

  • 표준화 기기 좌표계 (NDCS)
  • 투영 변환 후, 꼭짓점 좌표는 다음과 같이 정규화
    ➡ (x, y, z, w) > (x/w, y/w, z/w, 1)

Viewport Transformation

  • NDCS에서 SCS로
  • SCS : 화면 좌표계
  • glViewport (left, bottom, width, height)
  • 가시성 계산을 위해 z-value를 보존하는 뷰포트 변환
  • 가시성 계산을 위해 z 좌표가 남아있어야 함

View Volume vs Viewport


Multiple Viewports

profile
공부 백업용

0개의 댓글