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개의 점이 보이지만 가상으로는 여러개의 점을 만들 수 있음
- 직선과 평면은 그대로 유지
- 거리에 따라 정점 축소됨 ➡ 축소비율 증가
1. 지엘의 평행 투상
GL Parallel Projection
- 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 ⭐
(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
- Shearing (Sh)
- Scaling (S)
- Perspective transformation (T)
-
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. 뷰 포트 설정
Perspective Division (원근 분할)
- 표준화 기기 좌표계 (NDCS)
- 투영 변환 후, 꼭짓점 좌표는 다음과 같이 정규화
➡ (x, y, z, w) > (x/w, y/w, z/w, 1)
- NDCS에서 SCS로
- SCS : 화면 좌표계
- glViewport (left, bottom, width, height)
- 가시성 계산을 위해 z-value를 보존하는 뷰포트 변환
- 가시성 계산을 위해 z 좌표가 남아있어야 함
View Volume vs Viewport
Multiple Viewports