360 likes | 650 Views
Lecture #8. 제 5 장 . 관측 (viewing). 강의 내용. 합성 카메라 객체들을 3 차원 공간상에 명시 하는 방법 : 제 4 장 카메라 묘사 방법 : 제 5 장 관측 과정 1 단계 세계 프레임 카메라 프레임으로의 변환 : 모델 - 관측 행렬 ( 정규 관측 절차의 개념 ) 2 단계 투영의 종류 , 관측 공간 : 투영 행렬. 고전적 관측과 컴퓨터 관측. 컴퓨터 관측에서는 객체 , 관측자 , 투영면 들이 독립적으로 명시한다
E N D
Lecture #8 제 5 장. 관측(viewing)
강의 내용 • 합성 카메라 • 객체들을 3차원 공간상에 명시 하는 방법 : 제 4 장 • 카메라 묘사 방법 : 제 5 장 • 관측 과정 • 1 단계 • 세계 프레임 카메라 프레임으로의 변환 : 모델-관측 행렬 (정규 관측 절차의 개념) • 2 단계 • 투영의 종류, 관측 공간 : 투영 행렬
고전적 관측과 컴퓨터 관측 • 컴퓨터 관측에서는 객체, 관측자, 투영면 들이 독립적으로 명시한다 • 고적적 관측에서는 이들간의 특정관계를 정해 줌으로써 다양한 관측방법이 정의한다 고전적 관측을 살펴봄으로써 관측의 개념을 파악
관측의 기본 요소 객체 투영선(직선) 투영면 (평면) 투영중심(COP) 투영 중심 : 렌즈의 중심, 카메라 프레임의 원점
객체 투영선 투영면 투시 관측과 평행관측 • 투시(perspective) 관측 • COP가 유한 거리에 있는 경우, 원근법 적용 • 평행 관측 • COP 무한 거리에 있으면 DOP(Direction of Projection)가 된다
고전적 관측 전정면 정면경사 평면경사 등축 일점투시 삼점투시 고전적 관측들
고전적 관측 • 고전적 관측에는 주면(principal face)라는 개념이 존재 • 평행 투영 • 직교투영 : 투영면이 하나의 주면에 평행 • 축측투영 • 등축 투영 : 투영면이 세 개의 주면에 대칭 • 이축 투영 : 투영면이 두 개의 주면에 대칭 • 삼축 투영 : 일반적인 경우 • 경사투영 • 투시투영 • 일점 투시 • 이점 투시 • 삼점 투시
직교투영 직교 투영 • 투영면이 하나의 주면에 평행 • 투영선이 투영면에 수직 • 거리와 각이 보존 • 제도 작업에 적합
신전과 세 개의 다중관측 직교 투영들 다중관측 직교 투영 • 투영면이 하나의 주면에 평행 • 이미지로부터 형상을 얻기가 쉽지 않다
투영면 투영면 투영면 (a) 축측 투영의 구성 (b)평면도 (c) 측면도 축측 투영 • 투영면이 객체에 대하여 임의의 방향에 존재 • 투영선은 투영면에 수직
이축 삼축 등축 축측 관측들 축측 관측의 종류 • 등축(isometric) : 세 주면 방향으로의 축소비가 같음 • 이축(dimetric) : 두 주면 방향으로의 축소비가 같음 • 삼축(trimetric) : 세 주면 방향으로의 축소비가 다름
투영면 투영면 투영면 (a)경사투영의 구성 (b)평면도 (c) 측면도 경사 투영 • 투영선이 투영면과 임의의 각을 가진다 • 투영면과 평행한 주면의 각이 보존
투시관측 투시 투영
(a) 삼점투시 (b) 이점투시 (c) 일점투시 투시 투영의 종류 소실점 두 축방향이 투영면에 평행
카메라의 위치지정 • 카메라 프레임의 위치지정 • OpenGL에서의 초기 카메라 • 세계 프레임의 원점에 위치 • 방향은 –z 방향이라고 가정
방법 1: 모델-관측 행렬에 변환 적용(1) 모델-관측 행렬 = C일 때 새로이 q에 정의된 정점 : 세계 프레임 : q 카메라 프레임 : Cq q = (0,0,0) 카메라가 앞으로 d 만큼 이동 Cq = (0,0,-d) 정점 p는 두 프레임에서 동일
방법 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); 사용하기가 쉽지 않다
Look-at 위치지정 방법 2: looking-at에 의한 방법 gluLookAt(eyex,eyey,eyez, atx,aty,atz, upx,upy,upz); 세계 프레임에서의 좌표 OpenGL 유틸리티 함수가 모델-관측 행렬을 변경
화각(field of view) 단순한 투영들 • 카메라는 원하는 위치에 놓여졌다. • 이제 렌즈를 택하자 • 초점거리 • 화각 (fov) • 이미지 크기
두 종류의 카메라 필름
투영 변환 행렬 • 이제 투영에 대한 변환행렬을 유도하자. • 경우 1: 투시 투영 • 경우 2: 직교 투영 모델-관측 투 영 변환 파이프라인
-d) -d) -d -d 투시 투영
투시 투영의 특성 • 직선을 보존 • 어파인 변환이 아니다 (평행선이 유지되지 않음) • 비선형 • 투영된 위치로부터 원래의 위치로 역변환할 수 없다
동차 좌표를 이용한 투영 투시 투영 행렬
투영 파이프라인 모델-관측 투영 투시제산 투영 파이프라인
직교 투영 • 투영선이 관측 평면에 수직인 평행 투영 직교투영 행렬
화각 OpenGL에서의 투영 • 앞의 단순한 투영에서 고려하지 않은 사항 • 관측 공간 • 관측공간 외부의 것은 절단된다
관측 공간의 정의 절두체(frustrum)라 한다 관측공간 후절단면 전절단면 관측면 전후 절단면들
OpenGL에서의 투시 투영 • 투시 관측을 위한 두개의 함수 • glFrustrum(left, right, bottom, top, near, far); • gluPerspective(fovy, aspect, near, far); 전면 윈도우의 영역 • 양수 • COP로부터의 거리 화각 종횡비
glFrustrum() API • glMatrixMode(GL_PROJECTION); • glLoadIdentity(); • glFrustum(xmin,xmax,ymin,ymax,zmin,zmax);
w h 화각 aspect = 화각을 이용한 정의 gluPerspective() API gluPerspective(fovy,aspect,near,far);
glOrtho(xmin,xmax,ymin,ymax,zmin,zmax); 관측공간 OpenGL에서의 평행 관측 양수일 필요가 없다 • 직교 관측 함수만 제공
은면 제거 (1) 투영 관측공간 내의 다각형들 이미지 평면 내의 다각형들 어느 다각형을 투영해야 하는가?
은면 제거 (2) • 두 가지 알고리즘 • 객체 공간 알고리즘 • 이미지 공간 알고리즘 예) z-버퍼 (깊이버퍼) 알고리즘 • OpenGL API • z-버퍼 사용의 선택 • z-버퍼의 클리어 glutInitDisplayMode(GLUT_DEPTH, …) glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT);
장면 안에서의 카메라 움직임 (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(); }
장면 안에서의 카메라 움직임 (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, 2.0, -10.0, 10.0);glMatrixMode(GL_MODELVIEW); }