440 likes | 780 Views
관 측 (Viewing). 관측의 개요. 합성 카메라 객체들을 3 차원 공간상에 명시 하는 방법 카메라 묘사 방법 ( 관측 ) 관측 과정 1 단계 세계 프레임 카메라 프레임으로의 변환 : 모델 - 관측 행렬 ( 정규 관측 절차의 개념 ) 2 단계 투영의 종류 , 관측 공간 : 투영 행렬. 관 측 (Viewing). 고전적 관측과 컴퓨터 관측 카메라의 위치지정 단순한 투영들 OpenGL 에서의 투영 은면 제거 장면 내에서의 움직임 평행투영 행렬 투시투영 행렬
E N D
관측의 개요 • 합성 카메라 • 객체들을 3차원 공간상에 명시 하는 방법 • 카메라 묘사 방법(관측) • 관측 과정 • 1 단계 • 세계 프레임 카메라 프레임으로의 변환 : 모델-관측 행렬 (정규 관측 절차의 개념) • 2 단계 • 투영의 종류, 관측 공간 : 투영 행렬
관 측 (Viewing) • 고전적 관측과 컴퓨터 관측 • 카메라의 위치지정 • 단순한 투영들 • OpenGL에서의 투영 • 은면 제거 • 장면 내에서의 움직임 • 평행투영 행렬 • 투시투영 행렬 • 투영과 그림자
고전적 관측과 컴퓨터 관측 • 컴퓨터 관측에서는 객체, 관측자, 투영면 들이 독립적으로 명시되는데 반해서 • 고적적 관측에서는 이들간의 특정관계를 정해 줌으로써 다양한 관측방법이 정의됨 고전적 관측을 살펴봄으로써 관측의 개념을 파악
관측의 기본 요소 투영 중심 : 렌즈의 중심, 카메라 프레임의 원점
투시 관측과 평행관측 • 투시(perspective) 관측 • COP가 유한 거리에 있는 경우, 원근법 적용 • 평행 관측 • COP가 무한 거리에 있으면 DOP(Direction of Projection)가 됨
고전적 관측 (con’t) 고전적 관측에는 주면(principal face)라는 개념이 존재 • 평행 투영 • 직교투영 : 투영면이 하나의 주면에 평행 • 축측투영 • 등축 투영 : 투영면이 세 개의 주면에 대칭 • 이축 투영 : 투영면이 두 개의 주면에 대칭 • 삼축 투영 : 일반적인 경우 • 경사투영 • 투시투영 • 일점 투시 • 이점 투시 • 삼점 투시
직교투영 • 투영면이 하나의 주면에 평행 • 투영선이 투영면에 수직 • 거리와 각이 보존 • 제도 작업에 적합
다중관측 직교 투영 • 투영면이 하나의 주면에 평행 • 이미지로부터 형상을 얻기가 쉽지 않음
축측 투영 • 투영면이 객체에 대하여 임의의 방향에 존재 • 투영선은 투영면에 수직
축측 관측의 종류 • 등축(isometric) : 세 주면 방향으로의 축소비가 같음 • 이축(dimetric) : 두 주면 방향으로의 축소비가 같음 • 삼축(trimetric) : 세 주면 방향으로의 축소비가 다름
경사 투영 • 투영선이 투영면과 임의의 각을 가짐 • 투영면과 평행한 주면의 각이 보존
투시 관측의 종류 소실점 두 축 방향이 투영면에 평행
관 측 (Viewing) • 고전적 관측과 컴퓨터 관측 • 카메라의 위치지정 • 단순한 투영들 • OpenGL에서의 투영 • 은면 제거 • 장면 내에서의 움직임 • 평행투영 행렬 • 투시투영 행렬 • 투영과 그림자
카메라의 위치지정 • 카메라 프레임의 위치지정 • OpenGL에서의 초기 카메라 • 세계 프레임의 원점에 위치 • 방향은 –z 방향이라고 가정
Look-At에 의한 방법 gluLookAt(eyex,eyey,eyez, atx,aty,atz, upx,upy,upz); 세계 프레임에서의 좌표 OpenGL 유틸리티 함수가 모델-관측 행렬을 변경
관 측 (Viewing) • 고전적 관측과 컴퓨터 관측 • 카메라의 위치지정 • 단순한 투영들 • OpenGL에서의 투영 • 은면 제거 • 장면 내에서의 움직임 • 평행투영 행렬 • 투시투영 행렬 • 투영과 그림자
화각(field of view) 단순한 투영들 • 카메라는 원하는 위치에 놓여졌다. • 이제 렌즈를 택하자 • 초점거리 • 화각(fov) • 이미지 크기
단순한 투영들 (con’t) • 이제 투영에 대한 변환행렬을 유도하자. • 경우 1: 투시 투영 • 경우 2: 직교 투영 모델-관측 투 영
투시 투영 d) d) d d
투시 투영의 특성 • 직선을 보존 • 어파인 변환이 아님 (평행선이 유지되지 않음) • 비선형 • 투영된 위치로부터 원래의 위치로 역변환할 수 없음
동차 좌표를 이용한 투영 투시 투영 행렬
투영 파이프라인 모델-관측 투영 투시제산
직교 투영 • 투영선이 관측 평면에 수직인 평행 투영 평행투영 행렬
관 측 (Viewing) • 고전적 관측과 컴퓨터 관측 • 카메라의 위치지정 • 단순한 투영들 • OpenGL에서의 투영 • 은면 제거 • 장면 내에서의 움직임 • 평행투영 행렬 • 투시투영 행렬 • 투영과 그림자
화각 OpenGL에서의 투영 • 앞의 단순한 투영에서 고려하지 않은 사항 • 관측 공간 • 관측공간 외부의 것은 절단됨
관측 공간의 정의 절두체(frustrum)
OpenGL에서의 투시 • 투시 관측을 위한 두개의 함수 • glFrustrum(left, right, bottom, top, near, far); • gluPerspective(fovy, aspect, near, far); 전면 윈도우의 영역 • 양수 • COP로부터의 거리 Field of View Aspect Ratio
glFrustrum • glMatrixMode(GL_PROJECTION); • glLoadIdentity(); • glFrustum(xmin,xmax,ymin,ymax,zmin,zmax);
화각 aspect = w/h gluPerspective gluPerspective(fovy,aspect,near,far);
OpenGL에서의 평행 관측 • 직교 관측 함수만 제공 glOrtho(xmin,xmax,ymin,ymax,zmin,zmax);
관 측 (Viewing) • 고전적 관측과 컴퓨터 관측 • 카메라의 위치지정 • 단순한 투영들 • OpenGL에서의 투영 • 은면 제거 • 장면 내에서의 움직임 • 평행투영 행렬 • 투시투영 행렬 • 투영과 그림자
은면 제거 투영 관측공간 내의 다각형들 이미지 평면 내의 다각형들 어느 다각형을 투영해야 하는가?
은면 제거 (con’t) • 두 가지 알고리즘 • 객체 공간 알고리즘 • 이미지 공간 알고리즘 예) z-버퍼 (깊이버퍼) 알고리즘 • OpenGL • z-버퍼 사용의 선택 • z-버퍼의 클리어 glutInitDisplayMode(GLUT_DEPTH, …) glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT);
관 측 (Viewing) • 고전적 관측과 컴퓨터 관측 • 카메라의 위치지정 • 단순한 투영들 • OpenGL에서의 투영 • 은면 제거 • 장면 내에서의 움직임 • 평행투영 행렬 • 투시투영 행렬 • 투영과 그림자
장면 안에서의 움직임 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(); }
장면 안에서의 움직임 (con’t) 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); }
관 측 (Viewing) • 고전적 관측과 컴퓨터 관측 • 카메라의 위치지정 • 단순한 투영들 • OpenGL에서의 투영 • 은면 제거 • 장면 내에서의 움직임 • 평행투영 행렬 • 투시투영 행렬 • 투영과 그림자
투영과 그림자 • 그림자 • 사실적 이미지의 중요한 요소 • 광원의 위치를 투영의 중심으로 하여 그림자가 나타나는 평면에 투영을 수행
투영과 그림자 (con’t) • 광원의 위치를 원점으로 이동 • 투시 투영 행렬 • 원래의 위치로 이동
투영과 그림자 (con’t) • 앞의 세 행렬에 의하여 정점 (x, y, z)는 다음 위치로 변환
투영과 그림자 (con’t) GLfloat m[16]; for(i=0;i<16;i++) m[i]=0.0; m[0]=m[5]=m[10]=1.0; m[7]=-1.0/yl glColor3f(1.0, 0.0, 0.0); /* 객체 색 */ glBegin(GL_POLYGON); … glEnd(); glMatrixMode(GL_MODEL_VIEW); glPushMatrix(); glTranslatef(xl, yl, zl); glMultMatrixf(m); glTranslatef(-xl, -yl, -zl); glColor3f(0.0,0.0,0.0); /* 그림자 색 */ glBegin(GL_POLYGON); … /* 다각형을 다시 그린다 */ glEnd(); glPopMatrix();