제 5 장 관측

Post on 05-Jan-2016

141 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

제 5 장 관측. 정보통신공학부 송 창근. 관측의 두 부분. 모델 - 관측 행렬 객체들을 원점에 카메라가 위치한 프레임 상의 표현으로 전환함 정규 관측 절차의 사용이 가능 투영행렬 어떤 종류의 투영을 할지를 결정 : 평행투영 혹은 투시 투영 세계의 어떤 부분의 이미지를 얻을 지 결정 : 절단 , 관측 공간. 5.1 고전적 관측과 컴퓨터 관측. 객체. 투영선. 투영면. 그림 5.1 관측. 합성 카메라 모형. 객체 관측자 투영선 : 직선 - PowerPoint PPT Presentation

TRANSCRIPT

제 5 장 관측

정보통신공학부 송 창근

관측의 두 부분• 모델 - 관측 행렬

– 객체들을 원점에 카메라가 위치한 프레임 상의 표현으로 전환함

– 정규 관측 절차의 사용이 가능• 투영행렬

– 어떤 종류의 투영을 할지를 결정 : 평행투영 혹은 투시 투영

– 세계의 어떤 부분의 이미지를 얻을 지 결정 : 절단 , 관측 공간

그림 5.1 관측

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

투영면

투영선

객체

합성 카메라 모형• 객체• 관측자• 투영선 : 직선• 투영의 중심 (COP, Center of

Projection)– 카메라 혹은 눈의 중심– 카메라 프레임의 원점 ( 그래픽스 시스템 )

• 투영면 : 평면

투영의 방향• COP ( 투영의 중심 )

– COP 가 유한함 . 투영선이 한 점으로 만남 .– 투시 관측

• DOP ( 투영의 방향 ), Direction of Projection– COP 가 무한의 위치로 이동하면 , 투영선이

서로 평행하여진다 .– 평행관측

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

평행관측

평면 기하 투영• 투영면이 평면이고 투영선이 직선인

경우• 투시 투영과 평행 투영은 직선은

보존되지만 각도는 일반적으로 보존되지 않는다 .

컴퓨터 그래픽스 시스템• 컴퓨터 그래픽스 시스템

– 평행 관측 (Orthographic Parallel Viewing)

– 투시 관측 (Perspective Viewing)

• 고전적 관측– 다중 관측 정사 투영– 1 점 , 2 점 , 3 점 투시

그림 5.3 고전적 관측들

5.1.1 고전적 관측

정면경사

평면경사

등축

일점투시

삼점투시

평면기하투영의 분류

그림 5.4 직교 투영

5.1.2 직교 투영 (Orthographic Projection)

직교 투영• 투영선은 투영면에 수직이다 .• 다중 관측 직교 투영에서 투영면은 객체의

주면 (principal face) 중 하나와 평행하다 .• 그림 5.5 : 세 개의 다중관측 직교 투영들

• 직교 투영으로부터 관측자가 객체의 형상을 그려볼 수 있기 위해서는 세 개 이상의 관측이 필요하다

• 거리와 각이 보존된다 .

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

그림 5.5 다중 관측 직교 투영들

5.1.3 측측 투영 (axonometric projection)

• 투영선은 투영면에 수직이지만 , 투영면은 객체에 대해 어느 방향에도 존재할 수 있다 . 즉 , 어떤 기본측과도 투영면이 수직하지 않음 .

• 만일 투영면이 사각형 객체의 모서리에 만날 때 .( 그림 5.7)

-등축관측 (isometric view) : 세개의 주면에 대하여 대칭으로 놓여지면

-이축관측 (dimetric view) : 두 개의 주면에 대칭으로 놓인 경우

-삼축 관측 : 일반적인 경우

• 길이가 일정하게 축소됨 . 따라서 길이 계산이 가능-등축은 1 개의 축소비

-삼측 관측은 3 개의 축소비

• 평행선들이 이미지 안에서 보존되나 , 각은 그렇치 않다

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

5.1.3 측측 투영 (axonometric projection)

그림 5.7 축측 관측들

그림 5.7 축측 관측들

이축 삼축 등축

5.1.4 경사 투영 (oblique projection)

• 투영선과 투영면은 일정한 각을 가진다 .

• 투영면에 평행한 면 내의 각은 보존된다 .

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

5.1.4 경사 투영 (oblique projection)

그림 5.9 투시관측

5.1.5 투시 ( 원근 ) 관측 (Perspective Projection)

투시관측• 객체가 관측자로부터 멀어질수록 그 크기가

줄어든다 .• 길이 측정이 불가능하다 .• 건축분야 , 애니메이션 등 실감나는 영상이

중요한 분야에 사용

일점 , 이점 , 삼점 투시

• 객체의 세 가지 주방향 가운데 얼마나 많은 방향이 투영면에 평행한가에 따라서 일점 , 이점 , 삼점 투시로 구별된다 .

• 일점투시 : 두 개의 주 방향이 투영면에 평행하고 하나의 소실점이 존재

• 이점투시 : 하나의 주 방향이 투영면에 평행하고 , 두 개의 소실점이 존재

• 삼점투시 : 3 개의 주 방향에 평행한 모든 직선들은 3 개의 소실점에서 만난다 .

이점 투시 투영

그림 5.10 (a) 삼점 투시 (b) 이점투시 (c) 일점 투시

그림 5.10 일점 , 이점 , 삼점 투시

그림 5.11 초기 카메라 위치

5.2 카메라의 위치지정

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

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

그림 5.13 카메라의 위치 지정

그림 5.13

glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, -d);glRotatef(-90.0, 0.0, 1.0, 0.0);

그림 5.14 카메라의 프레임

5.2.2 관측 APIPHIGS

GKS-3DView Reference point(VRP)

View Plane Normal (VPN)

View-Up Vector (VUP)

set_view_plane_normal(nx, ny, nz);: VPN 은 투영면 즉 , 카메라의 후면의 방향

set_view_up(ux, uy, uz);: VPN 만 주어졌을 때 평면 위에 카메라의

뒷면을 대고 마음대로 회전시킬 수 있다 . VUP 는 이러한 카메라를 고정시킨다 .

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

그림 5.15

OpenGL 에서 사용

5.2.3 Look-At 함수

gluLookAt 함수

• gluLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz);- 카메라의 위치에 따라 모델 - 관측 행렬을 변경한다 .

• 카메라의 위치를 시점이라고 한다 .

그림 5.17 횡전 , 종전 , 편요

5.2.4 기타 관측 API

기타 관측 API

횡전 (Roll) : z 축을 중심으로 회전 종전 (pitch) : x 축을 중심으로 회전편요 (yaw) : y 축을 중심으로 회전

앙각 (elevation)방위각 (azimuth)꼬임각 (twist angle)

그림 5.18 앙각과 방위각

앙각

방위각

극좌표계

5.3 단순한 투영도광학 컴퓨터 그래픽스

카메라의 위치렌즈와 필름의 크기

카메라의 위치투영의 종류

광각렌즈망원렌즈

평행투영과 유사투시관측

5.3.1 투시 투영• 카메라의 위치 : 원점• 카메라의 방향 : -z 축 방향

(a) 대부분의 실제적인 상황

(b) 보다 일반적인 상황

카메라의 뒷면이 정면에 대하여 임의의 방향도 가질 수 있다 .

그림 5.19 두 대의 카메라

투시 변환• 투시 변환 (perspective transformation)

• 역변환 ( 투영의 위치로부터 원래의 위치로 ) 할 수 없다 .

• 직선은 보존되지만 affine 변환은 아니다 .

• 동치 좌표계 ( 주로 w=1 인 경우를 사용한다 .

),,(),,( ppp zyxzyx

),,,(),,( wwzwywxzyx

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

그림 5.20 투시투영의 세 관측들

dzx

x

d

x

z

x

p

p

dzy

y

d

y

z

y

p

p

dzx

x

d

x

z

x

p

p

dzy

y

d

y

z

y

p

p

비균일 축소 (nonuniform foreshortening)

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

0100

0100

0010

0001

d

M

1

z

y

x

p

dz

z

y

x

qM 은 한점 를 로 변환한다

p

p

p

zddz

z

ydz

y

xdz

x

투시제산

11

'p

p

p

z

y

x

ddz

ydz

x

q

그림 5.21 투영 파이프라인

모델 - 관측 투영 투시제산

5.3.2 직교 투영(orthographic)

• 투영선이 관측 평면에 수직인 평행 투영• 투시 투영 변환과 직교 투영 변환에

대해서 같은 pipeline 을 사용할 수 있지만 , 나눗셈은 불필요하다 .

그림 5.22 직교투영

0

p

p

p

z

yy

xx

11000

0000

0010

0001

1

z

y

x

z

y

x

p

p

p

5.4 OpenGL 에서의 투영

그림 5.23 관측 공간의 정의

화각

그림 5.24 전후 전단면들

5.4.1 OpenGL 에서의 투시glFrustum(xmin, xmax, ymin, ymax, zmin, zmax);

glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(xmin, xmax, ymin, ymax, zmin, zmax);

그림 5.25 절두체의 정의

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

그림 5.26 화각을 이용한 지정

gluPerspective(fovy, aspect, near, far);

5.4.2 OpenGL 에서의 평행관측

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

그림 5.27 직교관측

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

5.5 은면 제거• 은면 제거 알고리즘

(hidden-surface-removal algorithm)• 가시면 알고리즘

(visible-surface algorithm)• 객체 공간 알고리즘

(object-space algorithm)• 영상공간 알고리즘

(image-space algorithm)

• 깊이 버퍼 (z-buffer)• gluInitDisplayMode(GLUT_DOUBLE | GLUT_DE

PTH | GLUT_RGB);gluEnable(GL_DEPTH_TEST);

• glClear(GL_DEPTH_BUFFER_BIT);

그림 5.28 z- 버퍼 알고리즘

5.6 장면 안에서의 움직임

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

void keys(unsigned char key, int x, int y) { /* Use x, X, y, Y, z, and Z keys to move view

er */ 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 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);

}

5.7 평행 투영 행렬

5.7.1 투영 정규화• 투영 정규화 (projection normalization)

이란 객체의 일반적인 투영을 구현할 때 , 객체를 왜곡시킨 후에 직교 투영으로 변환하는 방식이다 .

• 예를들면 , 투시 투영을 구현할 때 , 물체를 적당히 왜곡한 후에 직교 투영을 적용한다 .

(a) 투시관측 (b) 왜곡된 객체의 직교 투영

그림 5.29 객체의 사전 왜곡

그림 5.30 정규화 변환

왜곡 ( 정규화 ) 직교투영

일반적인 투영을 동일한 절단 공간을 갖는 직교 투영으로 바꾼다 . 직교 투영이 원하는 일반적인 투영과 같을 수 있도록 투영행렬에 의해 객체들을 왜곡시킴으로써 가능하다

5.7.2 직교 투영 행렬

0

p

p

p

z

yy

xx

1

1

1

z

y

xglMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

정규관측 공간 (canonical view volume)

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

디폴트 관측공간

그림 5.31 관측공간을 정규관측공간으로 사상

• 투영행렬은 지정된 관측 공간을 정규 관측 공간으로 사상하는 4ⅹ4 행렬이다 .

• 지정된 관측 공간 내부 ( 외부 ) 의 점은 정규관측공간 내부 ( 외부 ) 의 점으로 변환된다 .

• 2 단계 과정 .

-이동변환을 통해 지정된 관측 공간의 중심을 정규관측공간의 중심 ( 원점 ) 으로 이동한다 .

- 지정된 관측 공간의 변의 길이가 2 가 되도록 크기 변환을 한다 .

그림 5.32 정규화를 위한 어파인 변환

관측공간을 정규관측공간으로 사상

))(2),(2),(2(

)2)(,2)(,2)((

minmaxminmaxminmax

minmaxminmaxminmax

zzyyxxS

zzyyxxT

1000

200

02

0

002

minmax

minmax

minmax

minmax

minmax

minmax

minmax

minmax

minmax

zz

zz

zz

yy

yy

yy

xx

xx

xx

STP

투영행렬

현재 가정은 투영선은 z 축의 음의 무한대에서 원점을 향하는 것이었다 . 그러나 OpenGL 의 경우는 투영선이 무한한 양의 z 축에서 시작한다 . 따라서 , 반사 변환 S(1,1,-1) 이 추가된다 .

1000

200

02

0

002

minmax

minmax

minmax

minmax

minmax

minmax

minmax

minmax

minmax

zz

zz

zz

yy

yy

yy

xx

xx

xx

STP

최종 투영행렬

5.7.3 경사 투영

그림 5.33 경사투영

그림 5.34 경사 절단공간

그림 5.35 경사투영의 (a) 평면도와 (b) 측면도

pxx

z

tan

0

cot

cot

p

p

p

z

zyy

zxx

pyy

z

tan

0

cot

cot

p

p

p

z

zyy

zxx

1000

0000

0cot10

0cot01

P

밀림변환 (shear)

그림 5.36 밀림변환의 효과

왜곡된 입방체의 직교 투영은 왜곡되지 않은 입방체의 경사 투영과 같다 .

1000

0100

0cot10

0cot01

1000

0000

0010

0001

),(

HPP orth

1000

200

02

0

002

minmax

minmax

minmax

minmax

minmax

minmax

minmax

minmax

minmax

zz

zz

zz

yy

yy

yy

xx

xx

xx

T

정규관측 공간이 아니기 때문에 , 밀림변환 후 그리고 최종의 직교 투영을 하기 전에 다음의 변환을 해야 한다 .

),( HTPP orth

5.8 투시 투영• 정규관측공간의 모습 • 투시 정규화 변환 (perspective

normalization transformation)– 투시투영을 직교투영으로 바꾸는 변환

• OpenGL 에서 사용되는 투시 행렬

5.8.1 투시 정규화

0100

0100

0010

0001

M

5.8.1 투시 정규화

0100

2200

0010

0001

N

관측공간의 측면들이 투여면을 45 도 교차하도록 함으로써 화각이 90 도로 고정한다 .

그림 5.37 간단한 투시투영

0100

0000

0010

0001

NM orth

z

y

x

NpMp orthp 0

z

yy

z

xx

p

p

변환로의해에 1" " xz

xxzx

변환로의해에 1" " yz

yyzy

변환로의해에앞쪽면 0" )1

1(2")(1 zz

zz

변환로뒤쪽면 )1

1(2")(max

max zzzz

그림 5.38 관측공간의 투시 정규화

5.8.2 OpenGL 투시 변환

)2

,2

()cot,(cotmin

maxmin

min

maxmin

z

yy

z

xxHH

min

max

min

minmax

min

minmax

2

2

zz

zz

z

yyy

z

xxx

1min

z

zy

zx

)1),(2,)(2( minminmaxminminmaxmin zyyzxxzS

그림 5.38 Open GL 투시

0100

00

0010

0001

Nz

zz

'

z

z

zz

zz

1

)('minmax

max

0100

00

0010

0001

minmax

max

minmax

max

zz

z

zz

zN

0100

200

02

0

002

minmax

minmax

minmax

minmax

minmax

minmax

minmax

min

minmax

minmax

minmax

min

zz

zz

zz

zzyy

yy

yy

zxx

xx

xx

z

NSHP

top related