Download presentation
Presentation is loading. Please wait.
1
Lecture #8 제 5 장. 관측(viewing)
2
강의 내용 합성 카메라 관측 과정 객체들을 3차원 공간상에 명시 하는 방법 : 제 4 장 카메라 묘사 방법 : 제 5 장
1 단계 세계 프레임 카메라 프레임으로의 변환 : 모델-관측 행렬 (정규 관측 절차의 개념) 2 단계 투영의 종류, 관측 공간 : 투영 행렬
3
고전적 관측을 살펴봄으로써 관측의 개념을 파악
고전적 관측과 컴퓨터 관측 컴퓨터 관측에서는 객체, 관측자, 투영면 들이 독립적으로 명시한다 고적적 관측에서는 이들간의 특정관계를 정해 줌으로써 다양한 관측방법이 정의한다 고전적 관측을 살펴봄으로써 관측의 개념을 파악
4
관측의 기본 요소 객체 투영선(직선) 투영면 (평면) 투영중심(COP) 투영 중심 : 렌즈의 중심, 카메라 프레임의 원점
5
투시 관측과 평행관측 투시(perspective) 관측 COP가 유한 거리에 있는 경우, 원근법 적용 평행 관측
COP 무한 거리에 있으면 DOP(Direction of Projection)가 된다 투영면 투영선 객체
6
고전적 관측 전정면 정면경사 평면경사 등축 일점투시 삼점투시 고전적 관측들
7
고전적 관측 고전적 관측에는 주면(principal face)라는 개념이 존재 평행 투영 투시투영
직교투영 : 투영면이 하나의 주면에 평행 축측투영 등축 투영 : 투영면이 세 개의 주면에 대칭 이축 투영 : 투영면이 두 개의 주면에 대칭 삼축 투영 : 일반적인 경우 경사투영 투시투영 일점 투시 이점 투시 삼점 투시 Various viewing methods were invented to show a specific relationship among the object, the viewer, and the projection plane.
8
직교 투영 투영면이 하나의 주면에 평행 투영선이 투영면에 수직 거리와 각이 보존 제도 작업에 적합 직교투영
9
다중관측 직교 투영 투영면이 하나의 주면에 평행 이미지로부터 형상을 얻기가 쉽지 않다 신전과 세 개의 다중관측 직교 투영들
10
(a) 축측 투영의 구성 (b)평면도 (c) 측면도
투영면이 객체에 대하여 임의의 방향에 존재 투영선은 투영면에 수직 투영면 (a) 축측 투영의 구성 (b)평면도 (c) 측면도
11
축측 관측의 종류 등축(isometric) : 세 주면 방향으로의 축소비가 같음
이축(dimetric) : 두 주면 방향으로의 축소비가 같음 삼축(trimetric) : 세 주면 방향으로의 축소비가 다름 축측 관측들 이축 삼축 등축
12
(a)경사투영의 구성 (b)평면도 (c) 측면도
경사 투영 투영선이 투영면과 임의의 각을 가진다 투영면과 평행한 주면의 각이 보존 투영면 (a)경사투영의 구성 (b)평면도 (c) 측면도
13
투시 투영 투시관측
14
(a) 삼점투시 (b) 이점투시 (c) 일점투시
투시 투영의 종류 소실점 두 축방향이 투영면에 평행 (a) 삼점투시 (b) 이점투시 (c) 일점투시
15
카메라의 위치지정 카메라 프레임의 위치지정 OpenGL에서의 초기 카메라 세계 프레임의 원점에 위치
방향은 –z 방향이라고 가정
16
방법 1: 모델-관측 행렬에 변환 적용(1) 모델-관측 행렬 = C일 때 새로이 q에 정의된 정점 : 세계 프레임 : q
카메라가 앞으로 d 만큼 이동 Cq = (0,0,-d) 정점 p는 두 프레임에서 동일
17
방법 1: 모델-관측 행렬에 변환 적용(2) 객체를 양의 x축 상에서 보고자 하는 경우 1. 뒤로 이동카메라를 이동
2. y축 중심으로 회전 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -d); glRotatef(-90.0, 0.0, 1.0, 0.0); 사용하기가 쉽지 않다
18
방법 2: looking-at에 의한 방법 gluLookAt(eyex,eyey,eyez, atx,aty,atz, upx,upy,upz); Look-at 위치지정 세계 프레임에서의 좌표 OpenGL 유틸리티 함수가 모델-관측 행렬을 변경
19
단순한 투영들 카메라는 원하는 위치에 놓여졌다. 이제 렌즈를 택하자 초점거리 화각 (fov) 이미지 크기
화각(field of view) focal length, field of view, image size. 이 세개의 parameter 중 어느것을 정해주는가? 이들 파라메터는 independent하지 않음. 선택의 자유가 있음. 통상적으로, focal length를 먼저 지정해 줌으로써 projection을 수학적으로 정의해주고, 그 다음에 field of view를 정함으로써 얼마만큼 보이도록 하겠는가를 결정해 준다.
20
두 종류의 카메라 필름
21
투영 변환 행렬 이제 투영에 대한 변환행렬을 유도하자. 모델-관측 투 영 변환 파이프라인 경우 1: 투시 투영
경우 1: 투시 투영 경우 2: 직교 투영 모델-관측 투 영 변환 파이프라인
22
투시 투영 -d) -d
23
투시 투영의 특성 직선을 보존 어파인 변환이 아니다 (평행선이 유지되지 않음) 비선형
투영된 위치로부터 원래의 위치로 역변환할 수 없다
24
동차 좌표를 이용한 투영 투시 투영 행렬
25
투영 파이프라인 모델-관측 투영 투시제산 투영 파이프라인
26
직교 투영 투영선이 관측 평면에 수직인 평행 투영 직교투영 행렬
27
OpenGL에서의 투영 앞의 단순한 투영에서 고려하지 않은 사항 관측 공간 관측공간 외부의 것은 절단된다 화각
28
관측 공간의 정의 절두체(frustrum)라 한다 관측공간 후절단면 전절단면 관측면 전후 절단면들
29
OpenGL에서의 투시 투영 투시 관측을 위한 두개의 함수
glFrustrum(left, right, bottom, top, near, far); gluPerspective(fovy, aspect, near, far); 전면 윈도우의 영역 양수 COP로부터의 거리 화각 종횡비
30
glFrustrum() API glMatrixMode(GL_PROJECTION); glLoadIdentity();
glFrustum(xmin,xmax,ymin,ymax,zmin,zmax);
31
gluPerspective() API w aspect = h 화각
화각을 이용한 정의 w h aspect = gluPerspective(fovy,aspect,near,far);
32
OpenGL에서의 평행 관측 직교 관측 함수만 제공 양수일 필요가 없다
glOrtho(xmin,xmax,ymin,ymax,zmin,zmax); 관측공간
33
은면 제거 (1) 투영 관측공간 내의 다각형들 이미지 평면 내의 다각형들 어느 다각형을 투영해야 하는가?
34
은면 제거 (2) 두 가지 알고리즘 OpenGL API 객체 공간 알고리즘 이미지 공간 알고리즘 z-버퍼 사용의 선택
glutInitDisplayMode(GLUT_DEPTH, …) glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT);
35
장면 안에서의 카메라 움직임 (1) void keys(unsigned char key, int x, int y) {
if(key == 'x') viewer[0] -= 1.0; if(key == 'X') viewer[0] += 1.0; if(key == 'y') viewer[1] -= 1.0; if(key == 'Y') viewer[1] += 1.0; if(key == 'z') viewer[2] -= 1.0; if(key == 'Z') viewer[2] += 1.0; display(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[1], 0.0, 1.0, 0.0); glRotatef(theta[2], 0.0, 0.0, 1.0); colorcube(); glFlush(); glutSwapBuffers(); }
36
장면 안에서의 카메라 움직임 (2) void myReshape(int w, int h)
{ glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-2.0, 2.0, -2.0*(GLfloat) h / (GLfloat) w, 2.0*(GLfloat) h / (GLfloat) w, -10.0, 10.0); else glOrtho(-2.0*(Glfloat) w / (Glfloat) h, 2.0*(Glfloat) w / (Glfloat) h, , 2.0, -10.0, 10.0); glMatrixMode(GL_MODELVIEW); }
Similar presentations