slide1 l.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
강의 내용 ( 열번째 ) PowerPoint Presentation
Download Presentation
강의 내용 ( 열번째 )

Loading in 2 Seconds...

play fullscreen
1 / 71

강의 내용 ( 열번째 ) - PowerPoint PPT Presentation


  • 590 Views
  • Uploaded on

강의 내용 ( 열번째 ) . 강의 내용 (5 월 21 일 ) : 5 장 관측 ( 고전적 관측과 컴퓨터 관측 ) 카메라의 위치 지정 ( 모델 - 관측행렬 , gluLookAT 의 사용 ) 단순한 투영들 ( 투시 , 직교 투영 ) 예제 : 장면 안에서 움직임 프로그램 예습 (5 월 28 일 ): Reading Assignment 5.7 장부터 5.10 장까지 (p239-p255) 숙제 없음 참고 5 월 14 일 휴강 ( 개교기념일 ). 제 5 장 관측.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '강의 내용 ( 열번째 )' - Gabriel


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1
강의 내용(열번째)
  • 강의 내용 (5월21 일) : 5장
    • 관측 (고전적 관측과 컴퓨터 관측)
    • 카메라의 위치 지정 (모델-관측행렬, gluLookAT의 사용)
    • 단순한 투영들 (투시, 직교 투영)
    • 예제: 장면 안에서 움직임 프로그램
  • 예습 (5월 28일): Reading Assignment
    • 5.7장부터 5.10장까지 (p239-p255)
  • 숙제
    • 없음
  • 참고
    • 5월 14일 휴강 (개교기념일)
slide2

제 5 장 관측

  • 관측의 두 부분(모델-관측행렬, 투영 및 절단)
  • OpenGL API가 관측을 어떻게 다루는지 보여 주기 위한 간단한 예제 프로그램
  • 평행관측과 투시관측의 투영행렬을 유도함.
slide3
관측의 두 부분(2개의 행렬)
  • 모델-관측 행렬
    • 객체들을 원점에 카메라가 위치한 프레임 상의 표현으로 전환함
    • 정규 관측 절차의 사용이 가능
  • 투영 행렬
    • 어떤 종류의 투영을 할지를 결정

: 평행투영 혹은 투시 투영

    • 세계의 어떤 부분의 이미지를 얻을 지 결정

:절단, 관측 공간

slide4
5.1 고전적 관측과 컴퓨터 관측

객체

투영선

투영의중심

투영면

그림 5.1 관측

slide5
합성 카메라 모형
  • 고전적 관측과 컴퓨터 관측에서 동일한 요소
    • 객체(Object)
    • 관측자(Viewer, Camera)
    • 투영선 (Projector): 직선
    • 투영의 중심 (COP, Center of Projection)
      • 카메라 혹은 눈의 중심
      • 카메라 프레임의 원점 (그래픽스 시스템)
    • 투영면 (Projection plane): 평면
slide6
투영의 방향
  • COP (투영의 중심)
    • COP가 유한함. 투영 선이 한 점으로 만남.
    • 투시 관측(Perspective view)
  • DOP (투영의 방향), Direction of Projection
    • COP가 무한의 위치로 이동하면, 투영 선이 서로 평행하여진다.
    • 평행 관측(Parallel view)
  • 현대 API에서는 평행 관측과 투시 관측 모두를 제공한다.
slide7
평행 관측

그림 5.2 투영중심을 무한대로 옮김

planar geometric projection
평면 기하 투영(Planar geometric projection)
  • 투영면이 평면이고 투영 선이 직선인 경우
  • 투시 투영과 평행 투영은 직선은 보존되지만 각도는 일반적으로 보존되지 않는다.
slide9
컴퓨터 그래픽스 시스템
  • 컴퓨터 그래픽스 시스템
    • 평행 관측 (Orthographic Parallel Viewing)
    • 투시 관측 (Perspective Viewing)
  • 고전적 관측 (다양한 관측 방법이 있음)
    • 다중 관측 직교 투영
    • 1점, 2점, 3점 투시
5 1 1
5.1.1 고전적 관측

평면경사

정면경사

일점투시

삼점투시

등축

그림 5.3 고전적 관측들

orthographic projection
직교 투영(Orthographic Projection)
  • 투영 선은 투영면에 수직이다.
  • 다중 관측 직교 투영에서 투영면은 객체의 주면 (principal face)중 하나와 평행하다.
  • 그림 5.5 : 3개의 다중 관측 직교 투영들
  • 직교 투영으로부터 관측자가 객체의 형상을 그려볼 수 있기 위해서는 세 개 이상의 관측이 필요하다
  • 거리와 각이 보존된다.
slide14
그림 5.5 다중 관측 직교 투영들

그림 5.5 신전과 세 개의 다중 관측 직교 투영들

5 1 3 axonometric projection
5.1.3 측측 투영(Axonometric projection)
  • 투영선은 투영면에 수직이지만, 투영면은 객체에 대해 어느 방향에도 존재할 수 있다. 즉, 어떤 기본측과도 투영면이 수직하지 않음. (그림 5.6)
  • 만일 투영면이 모서리에서 만나는 3개의 주면과 대칭으로 놓여지면.(그림 5.7)
    • 등축 관측(isometric view) : 세 개의 주면에 대하여 대칭으로 놓여지면
    • 이축 관측(dimetric view) : 두 개의 주면에 대칭으로 놓인 경우
    • 삼축 관측(trimetric view) : 일반적인 경우
5 1 3 axonometric projection16
5.1.3 측측 투영(Axonometric projection)
  • 길이가 일정하게 축소됨. 따라서 길이 계산이 가능
    • 등축 관측은 1개의 축소비,
    • 삼측 관측은 3개의 축소비
  • 평행선들이 이미지 안에서 보존되나, 각은 그렇치 않다.
    • 원은 타원으로 투영된다.
    • 이러한 왜곡은 컴퓨터나 수작업으로 손쉽게 만드는 하나의 관측에서 여러 개의 주면을 보기 위해 지불되는 비용이다.
5 1 3 axonometric projection17
5.1.3 측측 투영(Axonometric projection)

그림 5.6 (a) 축측 투영의 구성(b) 평면도 (c) 측면도

slide18
그림 5.7 축측 관측들

등축

이축

삼축

5 1 4 oblique projection
5.1.4 경사 투영(Oblique projection)
  • 가장 일반적인 평행 투영(Parallel Projection)
  • 투영선과 투영면은 일정한 각을 가진다.(그림 5.8)
  • 투영면에 평행한 면 내의 각은 보존된다.
  • 투영면에 평행한 면에 있는 원은 원으로 투영되고, 우리는 객체의 둘 이상의 주면을 볼 수 있다.
  • 경사 관측은 손으로 작성하기에는 매우 어렵다. 또, 다소 자연스럽지도 못하다.
5 1 4 oblique projection20
5.1.4 경사 투영(oblique projection)

그림 5.8 (a) 경사투영의 구성 (b) 평면도 (c) 측면도

perspective viewing
투시 관측(Perspective viewing)
  • 객체가 관측자로부터 멀어질수록 그 크기가 줄어든다.(자연스러운 관측)
    • 건축분야, 애니메이션 등 실감나는 영상이 중요한 분야에 사용함.
  • 길이 측정이 불가능하다.
    • 선분의 길이가 얼마나 짧아지는가는 그 선분이 관측자로부터 얼마나 떨어져 있는가에 의해서 결정되므로
slide23
일점, 이점, 삼점 투시
  • 객체의 세 가지 주방향 가운데 얼마나 많은 방향이 투영면에 평행 한가에 따라서 일점, 이점, 삼점 투시 (one, two, three point perspective)로 구별된다.
    • 일점투시 : 한 개의 소실점이 존재
    • 이점투시 : 두 개의 소실점이 존재
    • 삼점투시 : 3개의 주 방향에 평행한 모든 직선들은 3 개의 소실점에서 만난다.
slide24
그림 5.10 일점, 이점, 삼점 투시

(a) 삼점 투시 (b) 이점투시 (c) 일점 투시

slide25
5.2 카메라의 위치지정
  • OpenGL이 제공하는 API
    • - GKS-3D, PHIGS와 같은 API와의 차이점.
  • 카메라의 위치 지정 (5.2절)
  • 투영을 어떻게 명시하는 가? (5.4절)
  • 모델-관측 행렬의 사용
    • 공간에 객체의 위치를 지정하는 데 사용
    • 참조 프레임으로부터 카메라 프레임으로 변환할 때.
slide26
프레임, 좌표계과 모델-관측행렬
  • 모델링 프레임 (모델링 좌표계, 주좌표계)
    • 관측자의 위치와 종류에 관계없이 객체가 정의됨.
  • 세계 프레임, 사용자 프레임(세계 좌표계)
    • 카메라의 위치는 원점에 위치하고 방향은 –z 방향이다.
  • 카메라 프레임 (카메라 좌표계)
  • 모델-관측 행렬
    • 모델링 프레임의 객체를 세계 프레임으로 객체로 변환시킨다.
    • Identity matrix인 경우는 세계 프레임과 카메라 프레임이 동일한 경우이다.
slide27

Modeling

Transformation

Modeling

Coordinates

World

Coordinates

Viewing

Transformation

Viewing

Coordinates

Workstation

Transformation

Projection

Transformation

Device

Coordinates

Projection

Coordinates

5 2 1
5.2.1 카메라 프레임의 위치지정

그림 5.11 초기 카메라 위치

slide29
그림 5.12 카메라와 세계프레임의 이동

(a) 초기상태 (b) 모델-관측 행렬의 변경 후

slide30

모델-관측행렬(C)

세계 프레임(점 q)

카메라 프레임(점 q’)

slide31
객체로서의 카메라

Camera를 원하는 위치에 어떻게 지정하는가?

  • Default 위치의 카메라를 세계 프레임에 대하여 움직이는 것으로 생각하자. (카메라를 하나의 객체로 이해함)
  • 일련의 회전과 이동을 적용하여 움직인다. 따라서, 모델-관측 행렬의 값이 변경된다.
  • 예: 양의 x축 방향을 향한 객체면의 이미지를 원한다고 하자.
    • 그림 5.13에서와 같이 카메라를 객체로부터 멀리 떨어지게 하고, y축을 중심으로 회전시킨다.
slide32
그림 5.13 카메라의 위치 지정

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslatef(0.0, 0.0, -d);

glRotatef(-90.0, 0.0, 1.0, 0.0);

두 프레임의 관점에서 보면

(1)세계 프레임을 카메라 프레임에 대하여 회전한 후에

(2)두 프레임을 멀리 떨어뜨린다.

slide33
입방체의 등축 관측
  • 입방체의 인접하는 세 면들에 대해서 카메라가 대칭적으로 위치할 때 등축 관측을 얻게 된다.
  • 이 방향을 갖도록 입방체를 회전하고, 다음에 카메라를 멀리 이동시킨다.
    • 입방체를 Y 축을 중심으로 45도 회전
    • 입방체를 X 축을 중심으로 –35.26도 회전
    • 카메라를 멀리 이동
slide34

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslatef(0.0, 0.0, -d);

glRotatef(35.26,1.0,0.0,0.0);

glRotatef(45,0.0,1.0,0.0);

5 2 2 api
5.2.2 관측 API

PHIGS

GKS-3D

View Reference point(VRP)

View Plane Normal (VPN)

View-Up Vector (VUP)

그림 5.14 카메라의 프레임

slide36
두 개의 관측 API

set_view_plane_normal(nx, ny, nz);

: VPN은 투영면 즉, 카메라의 후면의 방향

set_view_up(ux, uy, uz);

: VPN만 주어졌을 때 평면 위에 카메라의 뒷면을 대고 마음대로 회전시킬 수 있다.

  • VUP는 이러한 카메라를 고정시킨다.
slide37
그림 5.15

그림 5.15 관측 상향 벡터의 결정

viewing coordinate system u v n
Viewing-coordinate system(카메라 프레임, u-v-n)
  • VRP (Viewing Reference Point) : 원점
  • VPN (Viewing Plane Normal); n
  • VUV (View Up Vector) : Vup , 관측면에 투영하여 v를 얻음
  • u=vn 으로 구함.
slide39

카메라는 원래 프레임의 대각선상에 위치하여야 하므로, 다음의 p를 사용하면

5.2.1에서 유도한 동일한 모델-관측 행렬을 얻는다.

5 2 3 look at
5.2.3 Look-At 함수

OpenGL 에서 사용

glulookat
gluLookAt 함수
  • gluLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz);

- 카메라의 위치에 따라 모델-관측 행렬을 변경한다.

  • 카메라의 위치(점 e)를 시점(eyepoint)이라고 한다. (VRP)
  • 지향점(at point) (점 e)
  • VPN = e – a
  • Up vector는 카메라의 상 방향을 나타냄.
5 2 4 api
5.2.4 기타 관측 API

그림 5.17 횡전, 종전, 편요

slide43
기타 관측 API

횡전 (Roll) : z축을 중심으로 회전

종전(pitch) : x축을 중심으로 회전

편요(yaw) : y 축을 중심으로 회전

앙각 (elevation)

방위각(azimuth)

꼬임각 (twist angle)

slide44
극좌표계

앙각

방위각

그림 5.18 앙각과 방위각

5 3 1
5.3.1 (단순한) 투시 투영
  • 카메라의 위치 : 원점
  • 카메라의 방향 : -z 축 방향
slide47
그림 5.19 두 대의 카메라
  • 대부분의 실제적인 상황
  • 보다 일반적인 상황
  • 카메라의 뒷면이 정면에 대하여 임의의 방향도 가질 수 있다.
  • 편의상 (a) 경우만 고려한다.
slide48
그림 5.20 투시투영의 세 관측들

(a) 삼차원 관측 (b) 평면도 (c) 측면도

nonuniform foreshortening
비균일 축소(Nonuniform foreshortening)

z로 나누어지므로 비균일 축소

slide50
투시 변환
  • 투시 변환 (perspective transformation)
  • 역 변환(투영의 위치로부터 원래의 위치로) 할 수 없다. 여러 개의 점이 한 점으로 투영되기 때문임.
  • 직선은 보존되지만 affine 변환은 아니다.
  • 동치 좌표계 (주로 w=1인 경우를 사용한다).
slide51

투시

투영행렬

로 변환한다

M은 한 점

perspective division
투시제산(Perspective division)
  • 동차 좌표에서 q의 w 성분으로 자신을 나누어 등가적인 점 q’로 바꿀 수 있다.
slide53
그림 5.21 투영 파이프라인

투영

투시제산

모델-관측

5 3 2 orthographic
5.3.2 직교 (정사) 투영(Orthographic)
  • 투영 선이 관측 평면에 수직인 평행 투영의 특수한 경우이다.
  • 투시 투영 변환과 직교 투영 변환에 대해서 같은 투영 pipeline을 사용할 수 있지만, 나눗셈은 불필요하다.
slide55
그림 5.22 직교투영

직교 투영행렬

Z=0(투영면)

5 4 opengl
5.4 OpenGL에서의 투영
  • 앞 절에서 논의한 단순한 투영에서는 카메라 렌즈의 초점 거리나 필름 크기와 같은 카메라의 특성을 고려하지 않았다.
    • 즉, 필름크기는 관측 공간을 제한하고, 이러한 관측 공간 안에 있는 이미지들만이 투영될 것이다. 즉, 절단을 고려하지 않은 경우에 해당되므로 완전하지 못하다.
  • 대부분의 그래픽스 API(OpenGL 등)는 투영에 대한 명세를 통해 절단 매개변수를 정의한다.
slide58
그림 5.24 전후 전단면들

절두체(Frustum)

  • 시야와 더불어 전후 절단면을 추가하여 유한한 절단공간을 정의한다.
5 4 1 opengl
5.4.1 OpenGL에서의 투시

glFrustum(xmin, xmax, ymin, ymax, zmin, zmax);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glFrustum(xmin, xmax, ymin, ymax, zmin, zmax);

-> 그림 5.25 참조

slide60
그림 5.25 절두체의 정의

glFrustum(xmin, xmax, ymin, ymax, zmin, zmax);

  • Z 축에 대해 대칭일 필요는 없다
  • 절두체 자체도 대칭일 필요는 없다
slide61
그림 5.26 화각을 이용한 지정

절단공간의

상단과 하단

사이의 각

gluPerspective(fovy, aspect, near, far);

종횡비(aspect ratio)=w/h

5 4 2 opengl
5.4.2 OpenGL에서의 평행관측
  • gluortho(xmin, xmax, ymin, ymax, zmin, zmax);
  • OpenGL에서 유일하게 제공되는 평행 관측 함수이다. (직교 관측 함수)
slide63
그림 5.27 직교 관측

gluortho(xmin, xmax, ymin, ymax, zmin, zmax);

slide64
요약
  • 투시관측
    • 모든 투영 선들은 원점에 있는 COP를 통과하기 때문에 앞면과 뒷면까지의 거리가 모두 양수
    • COP 뒤쪽의 객체는 COP 정면에 있는 객체와 비교했을 때 거꾸로 투영
    • 평면 z=0 상의 점들은 투영될 수 없다. 0 으로 나누기가 가능할 수 있다.
  • 평행관측
    • zmax > zmin 외에는 앞쪽과 뒤쪽 거리의 부호에 제약을 받지 않는다.
slide65
5.5 은면 제거
  • 은면 제거 알고리즘

(hidden-surface-removal algorithm)

    • 가시면 알고리즘

(visible-surface algorithm)

    • 객체 공간 알고리즘

(object-space algorithm)

    • 영상공간 알고리즘 : z-buffer algorithm

(image-space algorithm)

slide66
은면 제거
  • 깊이 버퍼 (z-buffer)
  • gluInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);
  • gluEnable(GL_DEPTH_TEST);
  • glClear(GL_DEPTH_BUFFER_BIT);
slide68
5.6 장면 안에서의 움직임
  • 4장의 color 프로그램 (cube.c)
    • - 색상 육면체 프로그램은 원점을 중심으로 육면체를 회전시킨다.
    • -직교 투영을 사용함.
  • colorview 프로그램 (cubeview.c)
    • 투시 관측을 사용함.
    • 관찰자가 키보드의 x,X,y,Y,z,Z를 이용하여 카메라를 이동시킴
    • gluLookAT 함수의 사용 : 카메라의 위치와 방향ㅇ를 바꾸는 데 사용됨.
slide69

Void display(void)

{

glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);

/* Update viewer position in modelview matrix*/

glLoadIdentity();

gluLookAt(viewer[0],viewer[1],viewer[2], 0.0, 0.0,

0.0, 0.0, 1.0, 0.0);

/* rotate cube */

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();

}

slide70

void keys(unsigned char key, int x, int y)

{

/* Use x, X, y, Y, z, and Z keys to move viewer */

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();

}

slide71

void myReshape(int w, int h)

{

glViewport(0, 0, w, h);

/* Use a perspective view */ glMatrixMode(GL_PROJECTION); glLoadIdentity();

if(w<=h)

glFrustum(-2.0, 2.0, -2.0 * (GLfloat) h/(GLfloat) w, 2.0* (GLfloat) h /(GLfloat) w, 2.0, 20.0);

else

glFrustum(-2.0, 2.0, -2.0 * (GLfloat) w/ (GLfloat) h, 2.0* (GLfloat) w / (GLfloat) h, 2.0, 20.0);

/* Or we can use gluPerspective */

/* gluPerspective(45.0, w/h, -10.0, 10.0); */ glMatrixMode(GL_MODELVIEW);

}