지엘의 투상변환
- 변환 행렬 지정을 위한 상수
변환종류 | 상태변수 값 (상수) | 목적 |
모델변환 시점변환 |
GL_MODELVIEW | 물체에 대한 기하변환 카메라 위치 및 방향에 대한 기하 변환 |
투상변환 | GL_PROJECTION | 촬영방법 및 렌즈 선택에 대한 기하 변환 |
void glMatrixMode(GL_PROJECTION);
void glGetFloatv(GL_PROJECTION_MATRIX); //투영 변환 행렬을 가져와서 메모리 위치에 저장
모델뷰 변환과 투상 변환이 조작하는 대상 행렬이 서로 다름
행렬 모드 설정의 기본값(Default)은 모델뷰 행렬
투상행렬 역시 행렬 스택으로 구성됨 (2개 이상)
지엘의 투상변환은 투상방식과 투상 범위를 지정
모델 뷰 행렬에 의해 물체를 정하고, 카메라의 위치와 방향이 설정되었다면, 이제 실제로 사진을 찍어야 한다. 즉, 만들어 놓은 3차원 물체를 2차원에 투상해야 한다.
투상 행렬 스택과 모델뷰 행렬 스택은 별개로 존재하므로, CTM 또한 각각 별개로 존재함.
지엘에서는 투상을 하기 위해 투상 방식과 투상 범위를 정해야 함. 투상 방식은 평행 투상이냐 원근 투샹이냐...
투상 범위는 3차원 공간의 어느 부분에 있는 물체를 투상할 것이냐이다.
지엘의 평행 투상
- 기본 평행투상
- 모델 좌표, 전역 좌표, 시점 좌표 순서로 변환된 상태
- P, P'은 시점 좌표계 기준의 좌표. 거리 d에 무관하게 동일한 모습
- 특이 변환 (Singular Transformation) : 역변환이 없는 변환
- (x, y, z, 1)에서 (x, y)만 읽어내면 그것이 투상된 2차원 좌표
- 깊이 정보를 활용하기 위해서 지엘은 이러한 변환을 가하지 않음
- 투상 결과 여전히 3차원 좌표가 유지
가시 부피에 의한 평행 투상
- 장면의 범위를 지정할 필요성 : 가시 부피 (View Volume)
- 전방 절단면 (Near Clipping Plane, Near Plane, Front Plane, Hither)
- 후방 절단면 (Far Clipping Plane, Far Plane, Back Plane, Yon)
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
//일반적인 평행투상, 투상면이 물체의 주 평면과 나란할 필요는 없음
//near과 far은 시점으로부터 전후방 절단면까지의 거리 (양수)
정규화 가시 부피
- 정규화 가시부피 (CVV : Canonical View Volume)
- 가로, 세로, 높이가 2인 정육면체로 투상
- 정규화 변환 (Normalization Transformation)
- 이유
- 평행투상, 원근투상을 동일한 모습의 정규화 가시 부피로 변형
- 동일 파이프라인 사용
- 정육면체를 기준으로 하는 연산이 간단함
- 시점 좌표계 원점을 중심으로 가로, 세로 길이를 1로 정규화함으로써 다양한 해상도의 화면 좌표계로 변환하기가 간단함
- 평행투상, 원근투상을 동일한 모습의 정규화 가시 부피로 변형
정규화 가시 부피 변환
- 물체에 대한 이동, 크기 조절, 반사 변환으로 간주
- Reflection : 정규화 가시 부피는 왼손 좌표계
- 결과적인 좌표계 = 절단 좌표계 (CCS : Clip Coordinate System) 3차원적 변환
지엘의 원근 투상
기본 투상
- 기본 원근 투상
원근 변환
- 원근 분할 (Perspective Division, Homogenization)
- 동차좌표의 마지막 요소로 이전 요소를 나누는 작업
- 절단이 동차좌표에서 이루어지기 때문에 절단 이후로 미루어짐
- 원근 분할을 가하면 실제로 그 동차좌표가 의미하는 3차원 좌표를 얻게 됨.
- 원근 변환
- 어파인 변환이 아님 : 마지막 행이 (0, 0, 0, 1)이 아님. (평행한 선분이 한 점에서 만나기도 함)
- 3차원 좌표 관점 : x' = x/(z/d) : 비선형 변환
- 4차원 동차 좌표 관점 : 선형변환 (변환 전의 변수에 상수배 한 것)
정규화 가시부피에 의한 원근 투상
- 절단 사각뿔(Frustum) = 절두체
원근 투상과 평행 투상
가시 부피
- 가시부피 설정에 의한 절
원근 투상의 정규화 가시 부피
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
//위 함수가 호출되면 내부적으로 정규화 변환이 이루어짐.
//이때 전단, 크기 변환 등의 과정을 거쳐 완성된 N이 CTM에 올려짐으로써 변환이 이루어짐
- 전방 절단면에 비해 후방 절단면이 줄어듦
- 멀리 있는 것이 작게 보여야 함
- T 행렬
- z값에 영향을 미침 : 원래의 물체 정점의 깊이 z와 정규화 변환 후의 물체 정점의 깊이 z'의 관
- 정규화 변환 결과 (z와 z' 비교)
변환 전 정점 | 위치 | 변환 후 정점 | 위치 |
(x, y, -n, 1) | 전방 절단면 | (x/n, y/n, -1, 1) | z=-1 평면 |
(x, y, -f, 1) | 후방 절단면 | (x/f, y/f, 1, 1) | z=1 평면 |
(0, 0, 0, 1) | 시점 | (0, 0, -2fn(f-n), 0) | -∞ |
(0, 0, -1, 1) | -∞ | (0, 0, (f+n)/(f-n), 1) | 유한 점 |
- 시점 좌표계에서 절단 좌표계로의 사상
시점 좌표계에서 절단 좌표계로
- 원근 변환에 따른 간격 변화
- 높이 : 멀어질수록 전봇대 높이가 낮아짐 (원근 변환)
- 간격 : 절단 좌표계의 (f+n)/(f-n) 점으로 가면서 크기도 줄지만 간격도 점차 줄어듦
- 간격 : 더욱 촘촘해짐에 유의 (비선형 변환)
- 전방 절단면 : 시점에서 멀리, 물체에 최대한 근접시켜 설정
- 물체 간격이 상대적으로 보존, 지-버퍼 처리에 유리
대칭적 원근 투상
void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far);
//fov는 시야, aspect는 뷰 윈도우의 종횡비 (뷰포트의 종횡비와 같아야 왜곡이 생기지 않음)
//near 값이 0이 되어버리면 정규화 변환 행렬 실행 도중 분모가 0이 되어버림
//이 함수는 glFrustum()와 실행 결과가 같다.
//bottom, top, left, right 값을 얻기 위한 변수 값 전환과정이 숨어있을 뿐
- 시야 (FOV : Field of View) : 상하 y축 방향의 시야각 (0-180도)
- x축 방향의 시야는 종횡비(Aspect Ratio)에 의해 결정됨 (폭 / 높이)
- near, far는 항상 양수
시야각과 초점렌즈
- 초점 거리 50㎜ 기준
- 광각 렌즈 (Wide Angle Lens) : 50보다 작음 - 시야각을 넓히는 것
- 망원 렌즈 (Telescope Lens) : 50보다 큼 - 시야각을 좁히는 것
- 사람의 눈이나 카메라 렌즈의 가시 부피는 잘린 사각뿔의 모습이 아니라 원뿔 (Cone)의 모습임. 대부분의 컴퓨터 그래픽 API는 잘린 사각뿔 형태의 가시부피를 사용함
시야각을 넓히는 것은 광각렌즈를 끼우는 것과 같으며, 시야각을 좁히는 것은 망원렌즈를 끼우는 것과 같다. 카메라 렌즈를 초점거리 (Focal Lenght)가 50㎜보다 작은 것이 광각렌즈, 큰 것이 망원렌즈이다. 망원렌즈를 끼우면 시야각이 좁아지는 대신 확대되어 보이며, 광각렌즈를 끼우면 시야각이 좁아지는 대신 축소되어 보인다.
투상 파이프라인
모델 좌표*모델 행렬 → 전역 좌표
전역 좌표*뷰 행렬 V → 시점 좌표
시점 좌표*투상 행렬 N → 절단 좌표
절단 좌표*원근 분할 → 정규화 장치 좌표
정규화 장치 좌표*뷰포트 변환 → 화면 좌표
화면 좌표*레스터 변환 → 디스플레이
투상 행렬은 가시 부피를 정의하고 가시 부피를 정규화 가시부피로 변환하기 위한 준비를 한다. 프로그램적으로는 glOrtho()와 glFrustum(), gluPerspective() 호출을 통해 이러한 과정이 이루어진다.
평행 투상의 경우 원근 분할이 불필요함. 따라서 평행 투상에서는 절단 좌표 자체가 정규화 장치 좌표가 된다.
'전공 > 컴퓨터 그래픽스' 카테고리의 다른 글
텍스처 (1)2D 텍스쳐 (0) | 2023.05.07 |
---|---|
투상 변환과 뷰 포트 변환 (3)지엘의 뷰 포트 변환 (0) | 2023.04.23 |
투상 변환과 뷰 포트 변환 (1)투상 (0) | 2023.04.23 |
모델변환과 시점변환 (4)지엘의 시점변환 & (5)3차원 회전 (0) | 2023.04.23 |
모델변환과 시점변환 (3)지엘의 모델변환 (0) | 2023.04.22 |
댓글