07 Three Dimensional Viewing

Download Report

Transcript 07 Three Dimensional Viewing

7장 Three-Dimensional Viewing
창원대학교 정보통신공학과
박동규
목차
7.1 INTRODUCTION
7.2 THE CAMERA REVISITED
7.3 BUILDING A CAMERA IN A PROGRAM
7.4 PERSPECTIVE PROJECTIONS OF 3D OBJECTS
7.5 PRODUCING STEREO VIEWS
7.6 TAXONOMY OF PROJECTIONS
IVIS Lab, Changwon National University
7.1 INTRODUCTION
• Goals of Chapter
– To develop tools for creating and manipulating a “camera”
that produces pictures of a 3D scene.
– To see how to “fly” a camera through a scene interactively
and to make animations.
– To learn the mathematics that describes various kinds of
projections.
– To see how each operation in the OpenGL graphics pipeline
operates and why it is used
– To build a powerful clipping algorithm for 3D objects.
– To devise a means for producing stereo view of objects.
IVIS Lab, Changwon National University
7.2 THE CAMERA REVISITED
• 5장에서 평행 투영을 생성하는 카메라를 사용하였음
– 이 카메라의 관측 볼륨은 6개의 벽으로 구성
– OpenGL은 평행 투영 뿐만 아니라 삼차원 장면을 위한 투시 투영
(perspective projection)을 지원함
• 그림에서 눈은 공간의 어떤 점에 위치하며, 관측 볼륨
(View volume)은 삼각피라미드의 단편
– 관측각(Viewangle)은 θ로 정의
– 두 평면은 피라미드 축선과 직각을 이루며 이를 near plane, far
plane이라 함
– 관측 평면은 피라미드과 교차하는 사각 윈도우 모양이 됨
• 프로그램으로 설정할 수 있는 종횡비(縱橫比,Aspect ratio)
가짐( a=w/h )
• (c)에서 관측 볼륨내의 한 점 p는 관측평면에 있는 대응점
p’에 투영됨
IVIS Lab, Changwon National University
관측 볼륨
IVIS Lab, Changwon National University
7.2.1 Setting the Volume
•
•
•
•
그림 7.2는 카메라가 디폴트 위치에 있는 그림
피라미드의 축은 z-축에 정렬되어 있고
눈은 음의 z-축으로 내려다 봄
네 개의 매개변수를 가진 gluPerspective() 함수
glMatrixMode(GL_PROJECTION); //투영 행렬을 현재 행렬도 둠
glLoadIdentity();
// 단위 행렬로부터 시작
gluPerspective(viewAngle ,aspectRatio, N , F);
//load the appropriate values
Example : gluPerspective (60.0 , 1.5 , 0.3 , 50.0);
IVIS Lab, Changwon National University
디폴트 위치의 카메라
IVIS Lab, Changwon National University
7.2.2 Positioning and Pointing the Camera
• 디폴트 위치에 있는 카메라는 관측을 위하여 이동시킬 필
요가 있음
– 카메라의 이동을 위하여 모델뷰 행렬(Modelview matrix)를 사용함
• 회전과 이동(rotation and translation)을 수행
– 투영행렬을 변형시켜 평행투영과 투시투영을 만들 수 있다
• Projection matrix는 관측 볼륨의 모양(shape of view volume)을 변
화시킴
• 관측 카메라의 위치와 관측방향 변화함수 : gluLookAt()
glMatrixMode(GL_MODELVIEW); //모델뷰 행렬을 현재 행렬로 둠
glLoadIdentity(); //단위 행렬로부터 시작
gluLookAt(eye.x, eye.y, eye.z, look.x, look.y, look.z, up.x, up.y, up.z);
IVIS Lab, Changwon National University
임의의 방위와 위치에 있는 일반 카메라
• 카메라는 공간상에서 임의의 위치와 방향에 둘 수 있다
• 그림과 같이 카메라를 원하는 방향으로 회전시키는 경우를 고려해 보자
– 눈의 위치를 중심으로 두고 그 방위를 표현하는 u- , v-, n-축이라는 세 축
을 정의함
– 이 세 축은 벡터 u, v , n 으로 주어진다
– 디폴트로 카메라가 음의 z-방향으로 바라보기 때문에 보통 카메라가 음의
n-축(-n)으로 바라본다고 말한다
IVIS Lab, Changwon National University
임의의 방위와 위치에 있는 일반 카메라
• u,v,n축은 x, y, z축의 복제품(clone)이라 할 수 있다
• 위치는 기술하기 쉽지만 방위는 기술하기 어렵다
• 롤(옆놀이, roll), 피치(키놀이, pitch), 요(빗놀이, yaw)의
지역 조정 시스템은 일반적으로 비행 오브젝트의 방위
(orientation)를 논의하기 위해 사용된다
–
–
–
–
Pitch: angle of longitudinal axis make with horizontal plane
Rolls: the amount of rotation relative to the horizontal.
Yaw : y-축으로 회전 common term for changing heading
Heading : 비행방향
IVIS Lab, Changwon National University
임의의 방위와 위치에 있는 일반 카메라
• 비행기의 진행방향(heading)은 비행기가 진행중인 방향
을 나타내며 주어진 벡터 n을 이용하여 진행방향과 피치
를 알기 위해서는 구형 표현(spherical expression)에서 –
n을 취하면 된다
– 벡터 –n은 각 와 로 주어진 경도(longitude)와 위도(latitude)를
가진다
– 비행기의 진행방향은 –n의 경도로 주어지며 피치는 –n의 위도로
주어진다
IVIS Lab, Changwon National University
임의의 방위와 위치에 있는 일반 카메라
• roll, pitch, yaw는 명사(noun)이면서 동사(verb)이다
– 동사로 사용될 경우 비행기의 방향 변화를 표현함
– 롤, 피치, 요와 같은 표현이 카메라에 적용될 수 있다
• 이 카메라의 원점은 눈(eye)에 해당한다
• 그림 (b)는 롤이 있는 상태 (c)는 롤이 없는 상태에 해당
– 롤이 없는 카메라의 u-축은 수평선이다
• 롤, 피치, 요를 어떻게 구현하는가
– gluLookAt() 함수를 이용한다
– gluLookAt() 만으로 up을 표현하기는 어렵다
롤이 있음
카메라의 방
향이 –n 임에
유의
IVIS Lab, Changwon National University
롤이 없음
gluLookAt()함수가 하는 일 : 수학적인 기초
• gluLookAt 함수
- gluLookAt(eye.x, eye.y, eye.z, look.x, look.y, look.z, up.x,
up.y, up.z); 형태
– 카메라의 위치(eye), 카메라가 보는 뱡향(look), 상향벡터(up
vector)를 가진다
• gluLookAt()함수가 하는 일 : 수학적인 기초
– n = eye – look(n은 필요에 의해서 정규화 함)
• u는 n과 up에 수직하므로 벡터의 외적을 구한다
– u = up ☓ n (벡터의 외적)
– v = n ☓ u (벡터의 외적) ∴ u,v,n은 상호 직교함
IVIS Lab, Changwon National University
gluLookAt()함수가 하는 일 : 수학적인 기초
• n=(nx, ny, nz), up=(0,1,0) 일때 u=up x n 이므로
u=( nz,,0,-nx)이고 v= n x u 이므로
v=(-nxny, n2x + n2z, -nzny)
• EXAMPLE 7.2.1 카메라 좌표계를 구하시오
– Eye = (4 , 4 , 4) , look = (0,1,0) , up =(0,1,0) 일때 u, v, n은?
Solution:
u = (4,0,-4), v = (-12,32,-12), n = (4,3,4)
- 또 up = (2,1,0) 일때 u , v , n을 구하라.
Solution:
u = (4,-8,-2), v = (38,8,-44) , n = (4,3,4)
IVIS Lab, Changwon National University
gluLookAt()함수가 하는 일 : 수학적인 기초
• EXAMPLE 7.2.2 Building intuition with cameras
– 카메라의 종횡비 = 2
•
•
•
•
한 카메라가 Eye = (-2,2,0) look = (0.0.0) up= (0,1,0) 에 설정될때
n = (-2,2,0), u = (0,0,2) v = (4,4,0)
두번째 카메라가 Eye = (2,2,0) look = (0,0,0), up= (0,0,1)에 설정
u = (-2,2,0), v = (0,0,8), n=(2,2,0)에서 v가 up과 평행한 벡터가 됨
IVIS Lab, Changwon National University
gluLookAt()함수가 하는 일 : 수학적인 기초
• 최종적으로 우리는 모델뷰 행렬에 놓여진 gluLookAt() 값
을 보고자 한다
• 우리는 모델뷰 행렬이 뷰 행렬 V와 오브젝트에 적용된 모
델링 행렬 M의 곱(product)에 의해 만들어짐을 알고 있다
(5장)
• gluLookAt() 함수는 V 행렬을 만들며 현재 행렬에 V 행렬
을 우곱셈(postmultiply) 시킨다
• V 행렬의 역할이 세계 좌표를 카메라 좌표로 전환시키는
것이므로, V 행렬은 카메라 좌표계를 카메라를 위한 일반
적인 위치(generic position)로 변환시켜야 한다
IVIS Lab, Changwon National University
gluLookAt()함수가 하는 일 : 수학적인 기초
• 행렬 V는 반드시 눈(eye)를 원점으로, u를 i로, v를 j로 n
을 k로 이동시켜야 한다
• 관측행렬 V는 몇 가지 트릭으로 다음과 같은 행렬을 얻을
수 있다
 ux

v
V  x
 nx

0
uy
vy
ny
uz
vz
nz
0
0
dx 

dy 
dz 

1
gluLookAt() 함수
가 설정한 변환
IVIS Lab, Changwon National University
d
x
dy
d z    eye  u , eye  v, eye  n 
gluLookAt()함수가 하는 일 : 수학적인 기초
• Extended point eye to homogeneous coordinates
 u x  1 
   
 u y   0
V  
 uz   0
 0   0
   
세계좌표계의 u는
카메라 좌표계의 i
값에 해당함.
IVIS Lab, Changwon National University
 vx   0 
   
 v y  1 
V   
 vz   0 
 0   0
   
 nx   0 
   
 ny   0
V  
 n z  1 
 0   0
   
7.3 BUILDING A CAMERA IN A PROGRAM
• 카메라 움직임을 세밀하게 제어하기 위하여 고유의 카메라 클래스를
말든다
• Camera object : cam
cam.set(eye, look, up); // initialize the camera
cam.slide(-1,0,-2); //slide the camera forward and to the left
cam.roll(30); //roll it through 30o
cam.yaw(20); // yaw it through 20o
• Shape of view volume : viewAngle , aspect, nearDist, farDist
IVIS Lab, Changwon National University
7.3 BUILDING A CAMERA IN A PROGRAM
•
•
•
•
유틸리티 함수 setModelViewMatrix()는 OpenGL의 모델뷰 행렬과 유사함
– 이 함수는 클래스의 멤버함수로만 동작하며 카메라의 위치와 방위에 의해 만
들어진 각 변화가 발생한 후 호출된다
glLoadMatrixf()로 수식 7.2의 행렬을 계산
gluPerspective(viewangle, aspect, nearDist, farDist) 로 카메라 필드 값 입력
slide(),roll(),yaw(),pitch() 로 카메라의 위치와 방위를 만듦
IVIS Lab, Changwon National University
7.3.1 To Fly the Camera Interactively
• 키를 누르거나 마우스 클릭을 이용해서 카메라를
이동시킴
• Sliding the Camera
–
회전 없이 u, v, n방향을 따라 움직이는 것
void Camera::slide( float delU, float delV , float delN)
{
eye.x += delU * u.x + delV *v.x + delN * n.x;
eye.y += delU * u.y + delV *v.y + delN * n.y;
eye.z += delU * u.z + delV *v.z + delN * n.z;
look.x += delU * u.x + delV *v.x + delN * n.x;
look.y += delU * u.y + delV *v.y + delN * n.y;
look.z += delU * u.z + delV *v.z + delN * n.z;
setModelViewMatrix();
}
IVIS Lab, Changwon National University
7.3.1 ”Flying” the Camera
• 카메라의 회전
– Roll, pitch, yaw는 자신의 축선에 대해
서 회전함
– roll은 n-axis에 대한 회전
– u’ 과 v’은 같은 평면상에 존재
– u’ = cos(α)u + sin(α)v;
– v’ = -sin(α)u + cos(α)v; (7.3)
IVIS Lab, Changwon National University
카메라의 roll
void Camera::roll(float angle)
{
float cs = cos(3.14159265/180*angle);
float sn = sin(3.14159265/180*angle);
Vector3 t(u); // 이전 u를 보관
u.set(cs*t.x – sn*v.x, cs*t.y – sn*v.y, cs*t.z – sn*v.z);
v.set(sn*t.x + cs*v.x, sn*t.y + cs*v.y, sn*t.z + cs*v.z);
setModelViewMatrix();
}
IVIS Lab, Changwon National University
pitch
void Camera :: pitch(float angle)
{
// roll the camera through angle degrees
float cs = cos(3.14159265/180 * angle);
float sn = sin(3.14159265/180 * angle);
Vector3 t(u); // remember old u
u.set(cs*t.x - sn*v.x, cs*t.y - sn*v.y, cs*t.z - sn*v.z);
v.set(sn*t.x + cs*v.x, sn*t.y + cs*v.y, sn*t.z + cs*v.z);
setModelViewMatrix();
}
IVIS Lab, Changwon National University
yaw
void Camera :: yaw(float angle)
{
// roll the camera through angle degrees
float cs = cos(3.14159265/180 * angle);
float sn = sin(3.14159265/180 * angle);
Vector3 t(u); // remember old u
u.set(cs*t.x - sn*v.x, cs*t.y - sn*v.y, cs*t.z - sn*v.z);
v.set(sn*t.x + cs*v.x, sn*t.y + cs*v.y, sn*t.z + cs*v.z);
setModelViewMatrix();
}
IVIS Lab, Changwon National University
Putting it all together
• 그림 7.13에서 본 바와 같이 카메라 클래스를 정의하여 장
면을 카메라가 날아다니도록 할 수 있다
• 이 장면은 차주전자 하나로 이루어짐
• 카메라는 키입력을 받아서 F가 입력되면 슬라이딩되며, f
가 입력될 경우 -0.2만큼 슬라이딩된다
• P가 입력되면 1도 위로 피치시키며 p가 입력되면 카메라
는 1도 아래로 피치된다
• glutSwapBuffers()를 통해서 더블 버퍼링을 실현
IVIS Lab, Changwon National University
IVIS Lab, Changwon National University
Drawing SDL Scenes Using A Camera
• SDL 파일을 이용한 프로그램에 카메라를 도입
– Camera cam;
– Scene scn; 의 전역변수
• 파싱 – scn.read(“myScene.dat”);
IVIS Lab, Changwon National University
7.4 삼차원 오브젝트의 투시투영
• Modeling part(M) : 모델링 변환 을 구체화함
• Viewing part(V) : 카메라의 위치와 방위(position and
orientation) 에 의해 설정된 변환으로 설명함
IVIS Lab, Changwon National University
7.4 삼차원 오브젝트의 투시투영
• 눈과 near plane은 z-축에 수직
• z = -N
• 정점 P는 near plane상의 어떤 점에 투영됨
– 이 점의 위치를 어떻게 얻어낼까?
– 삼각형의 비례식을 이용하면 된다(매우 간단함)
IVIS Lab, Changwon National University
7.4.1 정점의 투시투영
• 점 P = (Px , Py , Pz)가 (x*, y*) 점에 투영된다. 이 때 x*,y*를
구하면
– x*/Px = N/-Pz
– x*=NPx/(-Pz)
– y*= Npy/(-Pz)
• 따라서 (x*, y*) = (NPx /-Pz , Npy/-Pz)(점 P의 투영)
IVIS Lab, Changwon National University
7.4.1 정점의 투시투영
• Example 7.4.1를 풀어라
– P = (1,0.5,-1.5), N = 1
– 이 때 투영평면에 투영되는 (x*, y*) ?
sol) (x*, y*) = (0.666 , 0.333)
IVIS Lab, Changwon National University
7.4.1 정점의 투시투영
• Some preliminary observations
1.-Pz가 클수록 (x*, y*) 는 작아짐.(즉 멀리있는 점이 작게 나타나는데 이
를 투시적 단축(perspective foreshortening) 이라 함)
2. z=0 평면, 즉 눈과 동일한 평면에 P가 있을 경우 Pz는 0이 된다. 이 경
우 투영에 앞서 클리핑을 통해서 이 점을 제거함
3.”눈 뒤쪽에 있을 경우(behind the eye)” Pz 부호는 반전되는데 이 점은
클리핑되어 제거됨
4.viewplane과 near plane은 평행이기 때문에 N은 스케일(scale) 요소가
된다(즉 N이 크면 큰 x, y가 되고 N이 작으면 작은 x,y가 됨)
5.직선 AB 는 직선 A’B’로 투영된다
IVIS Lab, Changwon National University
7.4.1 정점의 투시투영
• 예제 7.4.2 창고의 세가지 투영
– 그림 7.18은 10개의 정점, 15개의 모서리, 7개의 면으로 구성된
창고(barn)임
– 이 창고 그림을 어떤 위치에서 보는가에 따라 투영되는 모양이
달라진다
– View #1은 (0,0,2), View #2는 (0.5,0,2)에서 View #3는 (2,5,2)
에서 바라봄
IVIS Lab, Changwon National University
7.4.1 정점의 투시투영
• View#1
– eye =(0,0,2) look down negative zaxis, u= (1,0,0) , n = (-1,0,0)
– Pz = -1
– P’ = (Px , Py)
• projection of a point on the front
wall
– Pz = -2
– P’ = (Px /2 , Py /2)
• projection of a point on the back
wall
• 후면의 단축값이 2가 됨
• 실제 길이의 절반이 됨을 알 수 있다
• View#2
– eye = (0.5,0,2), u, v는 #1과 동일함
– b) 그림과 같이 투영됨
IVIS Lab, Changwon National University
7.4.1 정점의 투시투영
• View #3
– 눈의 위치 (2,5,2), 시선 (0,0,0)
– 그림과 같이 안내를 위한 좌표축
을 추가하였음
– 와이어프레임 뷰의 경우 전후 구
분이 힘들다
IVIS Lab, Changwon National University
연습 문제 7.4.2
• 수식 (7.4)를 이용하여 원점에서 점 P로 나가는 광선이 근
접평면의 어느 점과 만나는가 알아보자
– a. 이 광선이 원점에 있을 경우 t=0, 점 P에 있을 경우 t=1이 되며
매개변수 방정식으로 r(t) = Pt
– b. 이 광선이 근접평면에서 t = N/(-Pz) 에서 만남을 보여라
– c. “hit point”가 (x*, y*) = (NPx/(-Pz), NPy/(-Pz)) 임을 보여라
IVIS Lab, Changwon National University
7.4.2 직선의 투시투영
• 삼차원에서 평행한 직선은 직선으로 투영되지만 반드시
평행하지는 않다.
– 이때 평행하지 않은 두 직선은 한 점에서 만나는데 이 만나는 점이
소실점(vanishing point)이 된다
• 카메라의 시선 뒤쪽에 있는 직선은 무한으로 투여되는 바
람직하지 않은 결과를 낳는다(이 경우 클리핑에서 제거)
• 투시 투영은 기하학적으로 사실적인 사진을 생성한다. 그
러나 이 사실성은 관측면에 평행한 매우 긴 직선의 경우
약간의 왜곡의 낳는다.
IVIS Lab, Changwon National University
평행선의 투영
• 평행선의 투영(Projecting Parallel Lines)
– 점 A = (Ax , Ay , Az)을 지나는 직선을 고려해 보자. 이 직선의 방
향 벡터 c =(cx ,cy ,cz )가 있을 경우 이 직선을 파라메트릭하게 정
의하자 P(t) = A+ct
– 이 직선에 수식 (7.4)을 적용하면 이 직선과 투영면이 만나는 좌표
를 구할 수 있는데
– 이 좌표는 p(t) = ( N(Ax + cxt) /(-Ax – czt) , (N (Ay + cyt ) /(-Az –
czt) ) 가 된다 (수식 7.5)
– 만일 A+ct가 관측 평면에 평행이면 cz= 0가 되어 P(t) = N/-Az(Ax
+ cxt , Ay + cyt ) 가 된다. 따라서 이 직선의 기울기는 cy/cx가 된
다(즉, 상수의 동일한 기울기를 가짐)
– 여기서 우리는 다음 결론을 얻을 수 있다
– “If two lines in 3D are parallel to each other and to the
viewplane, they project to two parallel lines”
IVIS Lab, Changwon National University
평행선의 투영
• 방향벡터 c가 관측면에 평행하지 않은 경우를 고려해 보
자, 즉 cz < 0 인 경우를 고려해 볼때
– t가 커질 경우 눈으로 부터 멀어지는데, 만일 t가 매우 크다면 수식
(7.5)에 의하여
– P(∞) = (Ncx/-cz , Ncy/-cz)가 되는데 이 점을 소실점(vanishing
point)이라 한다
– 모든 평행한 직선은 동일한 소실점을 공유한다(All parallel lines
share the same vanishing point)
IVIS Lab, Changwon National University
평행선의 투영
• 그림 7.21에서 정육면체는 몇 개의 평행한 직선을 가진다
• 정육면체의 정면이 근접 평면(Near plane)에 평행하므로
수직선과 수평선 역시 평행하다
• 그러나 물러나는 모서리는 근접평면에 평행하지 않으므
로 한 소실점(VP)에서 만난다
IVIS Lab, Changwon National University
평행선의 투영
• 그림 7.22는 소실점의 기하학적 의미를 설명한다
– 이 그림은 위쪽에서 카메라의 xy-평면을 내려다 본 것이다
– 직선 AB에 있는 점을 카메라로 관측할 경우 A는 A’, B는 B’으로
투영됨
– 직선상의 매우 먼 점은 나타난 바와 같이 VP로 투영된다
– 점 VP는 AB 직선과 평행한 직선중에서 눈의 위치에서 시작하는
직선상에 있다
IVIS Lab, Changwon National University
눈의 뒤쪽을 지나는 직선
• 눈을 지나는 직선의 경우를 살펴보면
– 눈의 앞에 있는 A는 관측면 A’에서 만나고 B는 눈의 뒤쪽에 있어 관측
면의 B’에서 만난다.
– 직선 AB상에서 움직이는 점 C를 고려해 보면 B에 가까워 질수록 관측
면과 만나는 점은 눈의 위치에서 멀어지며 C가 눈이 위치한 평면에 가
까워지면 C’은 무한대의 위치에 가까워진다
– C가 눈의 뒤쪽에 가면 “무한대 근방에 쌓여있다(wrapped around
infinity)”라고 한다
– 투영을 하기에 앞서 눈과 근접 평면사이의 점은 클리핑된다
IVIS Lab, Changwon National University
매우 긴 평행선 관측시의 착시현상
• 투시 투영은 우리가 관측하는 방식을 모델링하는 합리적
인 모델처럼 보인다
– 그러나 눈은 평평한 관측 평면을 가지지 않으므로 착시현상이 발
생한다
– 매우 긴 오브젝트의 관측시에 발생
– 매우 긴 전화선을 그림과 같이 관측할 경우 소실점에 수렴하는
곡선 형태로 보여진다
IVIS Lab, Changwon National University
7.4.3 그래픽 파이프라인에 투영을 결합
• 우리는 삼차원 객체의 정점을 근접평면상에 투영시킨 다
음에 이 점을 시역에 사상시키는 그래픽스 파이프라인을
원한다
– 모델뷰 행렬을 통과한 다음 정점은 카메라의 좌표 시스템에 놓이
게 된다.
IVIS Lab, Changwon National University
의사 깊이 추가(Adding Pseudodepth)
• 투영시킬 경우 깊이 정보는 삭제된다
– 눈과 점 사이의 거리는 잃게 된다
• 우리는 깊이 정보를 완전히 제거하면 안되며 은면 제거에
사용해야 한다
• 눈과 점 사이의 실제거리는 sqrt(Px2+Py2+Pz2) 이 됨
– 실제거리를 일일이 구하는 것은 힘들다
IVIS Lab, Changwon National University
의사깊이(Pseudodepth)
• 같은 직선상에 있는 P1 P2 사이의 거리, z* 값
– P1 이 P2 를 가리는지 반대인지를 구하고자 함
• 의사깊이 함수의 적절한 선택 값
–
–
–
–
(x*, y* ,z*) = (NPx/-Pz ,NPy/-Pz,(aPz+b)/-Pz)
상수 a와 b를 선택
의사깊이 값이 -1과 1사이에 있도록 적절한 값을 선택
의사깊이는 Pz = -N일 때 -1, Pz = -F 일 때 1
 2 FN
 (F  N )
b

a
FN
FN
IVIS Lab, Changwon National University
의사 깊이
• 의사 깊이를 구하기 위한 연산
x* 
NPx
 Pz
NPy
y* 
 Pz
z* 
aPz  b
 Pz
 NPx 


 x *   Pz 
 y *  NPx 
  P 
 z *  aP z b 
1  z

 

P
z 

 1 
IVIS Lab, Changwon National University
의사깊이(Pseudodepth)
• 그림 7.22는 의사깊이 대 (-Pz)의 그림이다
– 이 값은 근접평면(near plane)에서 -1이며 원접평면(far plane)에서는
+1이다
– Pz 가 무한에 가까울수록 음의(-) 무한으로 급하락(plummet)한다
– 의사 깊이 값은 -Pz 가 F에 가까워짐에 따라 천천히 증가한다
– 의사깊이 값은 - Pz 방향으로 멀어질수록 더욱 큰 값이 되고 –Pz 방향으
로 가까워질수록 작은 값이 되는데 이런 면은 Pz가 눈으로 부터 멀어질수
록 깊이 값이 증가한다는 점에서 합리적이라 할 수 있다
IVIS Lab, Changwon National University
예제
• 예제 7.4.4 Pseudodepth varies slowly as –Pz
approaches F
– Suppose N = 1 and F = 100 then a = -101/99 and b = 200/99,so we have
– pseudodepth|N=1,F=100 = (101Pz + 200)/ 99Pz
– 이 함수는 근사적으로 Pz = -N 일 때 -1, Pz = -F 일 때 1이 된다
– 그러나 –F에 가까워질 수록 –Pz에 대해 천천히 그 값이 증가한다.
97, 98, 99를 각각 입력해 보라!
• N 이 F 보다 매우 작은 값이므로 근사화가 가능
– Pseudodepth ≒ 1 + 2N/ Pz (7.9)
– 이 함수는 Pz가 F에 가까울수록 천천히 증가한다
IVIS Lab, Changwon National University
동차 좌표계의 사용
• 동차 좌표계의 사용
– 점 P =(Px , Py , Pz )
– 점 P의 동차 좌표계 표현 (Px , Py , Pz ,1)
– 벡터 V = (Vx , Vy , Vz)
– 벡터 V의 동차 좌표계 표현 (Vx , Vy , Vz , 0)
IVIS Lab, Changwon National University
동차 좌표계
• 보통 좌표계의 점을 동차 좌표계의 점으로 변경하고자 한
다면 1을 추가한다
• 동차 좌표계를 사용하면 유사 변환을 잘 표현할 수 있다
• A point P in homogeneous representation by such a
matrix M to from MP=Q
2

6
0

0

 1 3 1   wpx   wQx 
 


.5 1 4   wp y   wQy 

4 3  3  wpz   wQz 

0 0 1   w   w 
the final component of Q will always be unaltered : It is still
w. Therefore, we can convert the Q back to ordinary
coordinates in the usual fashion.
IVIS Lab, Changwon National University
동차 좌표계
• 평행한 두 직선은 만나는가?
데카르트 좌표계(직교 좌표계)에서 ?
IVIS Lab, Changwon National University
NO
53
동차 좌표계
• 평행한 두 직선은 만나는가?
Point at infinity (∞,∞),
투영공간에서 ?
IVIS Lab, Changwon National University
YES
54
동차 좌표계
• Problem : Two parallel lines can intercept
• Solution :
– N차원 공간에 N+1 차수를 추가하여 이 문제를 해결
– (X,Y) -> (x,y,w) 를 도입
X = x/w
– 예)
Y = y/w
• 데카르트 좌표계의 점 (1,2)는 동차좌표계에서 (1,2,1)이 됨
• 무한대의 위치에 있는 점 (1,2)는 (1/0, 2/0) = (∞,∞)이 되어 동차좌
표계에서 (1,2,0)으로 표현함
• ∞을 사용하지 않고도 무한을 표현할 수 있다는 장점.
IVIS Lab, Changwon National University
55
Homogeneous?
• Homogeneous는 “동질의”라는 의미
– 동차좌표계 값은 /w 로 데카르트 촤표계로 변환가능
IVIS Lab, Changwon National University
56
증명
• Two parallel lines can intercept
– 유클리드 공간에서 위의 선형방정식의 해?
• C=D 이면 두 직선은 겹친다.
• C≠D 이면 해가 존재하지 않는다.
– 위의 식을 투영공간에서의 식으로 고쳐보자.
• x, y를 x/w, y/w로 고치면
IVIS Lab, Changwon National University
57
• 앞의 식에서 (C - D)w = 0 이므로 ∴ w = 0, 즉 (x,y,0)가
해가된다.
– 즉 (x,y,0)인 점(무한대 공간에서의 점)에서 만난다.
• 이와 같이 동차좌표계는 3D장면을 2D평면에 투영시키기
위한 도구로, 컴퓨터 그래픽스에서 매우 유용하게 사용된
다.
IVIS Lab, Changwon National University
58
동차 좌표계
• 변환 행렬의 네 번째 행 (0, 0, 0, 1) 값에 변형을 가하여
N

0
0

0

0 0 0   wpx   wNPx 

 

wNP
wp
N 0 0  y  

y

0 a b   wpz   w(aPz  b) 

0  1 0   w    wPz 
(투영행렬)
• 위의 행렬에 투영할 점 P를 곱하여 얻은 점에 대하여 –wPz
를 나눌 경우
Py
Px
aP  b
(N
,N
,N z
)
 Pz
 Pz
 Pz
• 이 행렬은 삼차원 정점 P 를 다른 삼차원 P’ 으로 변환시킨
다
Py
Px
aP  b
( Px , Py , Pz )  ( N
,N
,N z
)
 Pz
 Pz
 Pz
IVIS Lab, Changwon National University
동차 좌표계
• Ignoring the third component is equivalent to replacing it
by zero, as in
Py
Py
Px
Px
aPz  b
(N
,N
,N
)  (N
,N
, 0)
 Pz
 Pz
 Pz
 Pz
 Pz
• (perspective projection) = (perspective transformation)
+ (orthographic projection)
IVIS Lab, Changwon National University
The Geometric Nature of the Perspective
Transformation
• The perspective transformation alters the 3D point P
into another 3D point according to (7.11), in order to
“prepare” the point for projection.
• The perspective transformation “warps” objects so that,
when viewed with an orthographic, they appear the
same as the original objects do when viewed with a
perspective projection.
• 직선은 직선으로 평면은 평면으로 변환
IVIS Lab, Changwon National University
The Geometric Nature of the Perspective
Transformation
• 변환은 오브젝트를 새 오브젝트로 와핑시킨다
• 그림 b와 같이 원평면 부근의 면은 y=1로 근접 평면 부근의 면은
y=2로 투영시킴
IVIS Lab, Changwon National University
7.4.3 Incorporating Perspective into the
Graphics Pipeline
• Details of the Transformed View Volume; Mapping into
the Canonical View Volume
– 최상위(top plane) 평면은 y = top 평면으로 변환되어야 함;
– 최하위 y = bottom 평면으로 변환됨, 왼쪽은 x = left 평면, 오른쪽
은 x = right 평면으로 변환되어야 함
– 정규 관측 볼륨(Canonical view volume) : 각 차원에 대하여 –1에
서 1 까지 영역까지만 확장된 정육면체
IVIS Lab, Changwon National University
Details of the Transformed View Volume;
Mapping into the Canonical View Volume
• 모든 차원에 대하여 -1에서 1사이의 값을 가지는 canonical view
volume으로 scale 시키고 shift 시킨다
• z축에 대해서는 이미 정규화 되었으므로 x,y축에 대하여 정규화 함
• 우선 x축으로 –(right+left)/2 만큼 y축으로 -(top+bottom)/2 만큼
shift 시킴.
– 즉 (–(right+left)/2, -(top+bottom)/2) 좌표가 원점이 되도록
• x축으로 2/(right-left) 으로 y축으로2/(top-bottom)만큼 스케일
• 최종 행렬은 다음과 같다
 2N
0
 right  left

2N

0
R
top  bott

0
0


0
0 a

IVIS Lab, Changwon National University
right  left
right  left
top  bott
top  bott
 (F  N )
FN
1



0  (the projection matrix)

 2 FN 
FN
0  b
0
정규 관측 볼륨 변환
 xcanonical  2
y
 
canonical


 zcanonical  

 
1

 
r  l 
0
0
0
0
0
0
 1
 0
2 t  b 
0
0

0
 ( F  N ) /( F  N ) 2 FN /( F  N ) 0

0
0
1
 0
0  (r  l ) / 2
1  (b  t ) / 2
0
1
0
0
0
 r  l  /( r  l )
0
2 r  l 
  xview 
 0
 y 


2
t

b

(
t

b
)
/(
t

b
)
0
  view 

 0
0
 ( F  N ) /( F  N ) 2 FN /( F  N )  zview 



0
0
1
 0
 1 
x canonical  M view canonicalx view
0
0
0

1
• To project, map the view volume onto the canonical
view volume
– After that, we know how to map the view volume to the
window
• The mapping looks similar to the one for
canonical→window:
IVIS Lab, Changwon National University
Details of the Transformed View Volume
• Mapping into the Canonical View Volume
• 투영 행렬은 투영 변환과 스케일링, 시프팅을 통한 카메라
뷰 볼륨을 canonical view volume(정규 관측 볼륨)으로
변환시키는 작업
• OpenGL 함수
– glFrustum(left, right, bott, top, N, F)
– gluPerspective(viewAngle, aspect, N, F)를 사용할 경우 top,
bottom, right, left는 각각 유도 함수를 이용하여 구함
top  N tan(

viewangle / 2)
180
bottom  top
right  top  aspect
IVIS Lab, Changwon National University
7.4.4 Clipping Faces against the View Volume
• 정점이 투영행렬을 거친 후 클리핑 된다는 점을 고려할 것
– 정규관측공간에서 클리핑 하는 것이 효과적이다.
•
그림 a에서 정점 v1, v2, v3에 대하여 클리핑 에지를
구하여 a,b를 얻는다
– 최종적으로 v1v2ab의 사각형이 남게 된다
•
클리핑 문제는 기본적으로 CVV에 대한 선분 절단
알고리즘이다
IVIS Lab, Changwon National University
7.4.4 Clipping Faces against the View Volume
• 각 정점은 CVV에 대하여 클리핑 됨
– 6개의 무한한 평면으로 CVV를 간주하고 이 CVV에 대하여 점 A와
B를 연결하는 직선과의 교차 검사
– 직선의 방정식은 A + (C-A)t 이 된다
– Check both vertices to see if they lie inside or outside the cannonical
viewing volume.
– Perform clipping if any edge is outside the cannonical viewing
volume.
– 4장에서 배운 Cyrus-Beck 알고리즘 사용
• 두 정점이 동일한 평면의 한쪽 면에 있다면 교차검사는 불필요하다
– x = -1인 평면을 생각해 보면
• 점 A는 다음 조건을 만족할 경우 이 평면의 오른쪽(즉 내부)에 있다
ax
 1, 또는a x  aw , or (aw  a x )  0
aw
– x = 1 평면의 내부에 존재하는 경우
ax
 1, 또는(aw  a x )  0
aw
IVIS Lab, Changwon National University
Why Did We Clip against the Canonical
View Volume?
• Canonical View Volume에서 클리핑을 할 경우 쉽게 할
수 있음
– CVV는 매개변수에 영향을 받지 않음
• 이 알고리즘은 볼륨을 클리핑하기 위한 추가적인 변환이 필요없다
(-1에서 1사이의 값만을 사용함)
– CVV의 평면은 좌표축에 대하여 정렬되어 있다
• 이 때문에 평면의 어느쪽에 있는가 (ax>-1와 같이) 만을 보면 된다.
• 만일 평면이 정렬되어 있지않다면 추가적인 연산이 필요하다
IVIS Lab, Changwon National University
The Viewport Transformation
• 투시 변환은 장면을 canonical view volume으로 늘어뜨린다
– 만일 카메라의 뷰 볼륨의 종횡비가 1.5라면 종횡비 1의 윈도우로 스케
일 될 때 왜곡이 발생
– 그러나 시역(viewport) 변환은 이 왜곡을 종횡비 1.5로 다시 복구
– 보통 시역의 종횡비를 관측 볼륨의 종횡비와 동일하게 한다
– glViewport(x,y,wid,ht) 함수 사용
IVIS Lab, Changwon National University
7.5 To produce Stereo Views
• 스테레오 관측은 그림을 보다 지능적으로 보이게 함
– 깊이 정보의 생성으로 인하여 시각적 모호성(ambiguity)를 감소시킴
• a) using the same LookAt point , different eye position
• b) left-eye picture is displayed in the viewport right-eye picture
is displayed in the viewport
IVIS Lab, Changwon National University
7.5 To produce Stereo Views
• Buckyball 의 와이어 프레임 뷰
– 어디가 앞이고 어디가 뒤인지 모호함
– 스테레오 뷰를 통해서 모호성을 제거할 수 있음
IVIS Lab, Changwon National University
7.5 To produce Stereo Views
• 아래 그림은 창고의 스테레오 뷰이다
– a) 카메라가 40o 롤 됨
• 창고의 방위는 스테레오 효과 없이 이해하기가 힘들다
– b) 창고의 한 코너를 접사
• 투시투영의 결과로 인한 심각한 왜곡을 분명히 볼 수 있다
IVIS Lab, Changwon National University
7.5 To produce Stereo Views
• 왼쪽과 오른쪽 눈을 어디에 둘 것인가
– 간단한 방법으로 LookAt 점과 cyclops eye(애꾸눈)을 어디에
둘 것인가
– 왼쪽과 오른쪽 눈은 애꾸눈의 위치에 약간의 변위 D를 –u, u
방향으로 둠
IVIS Lab, Changwon National University
7.6 Taxonomy of Projections
• 여태까지 평면 투영의 기본 아이디어를 알아봄
– 예술, 건축, 공학분야에 사용되는 많은 투영법이 있음
– 다음의 트리 구조로 볼 수 있음
IVIS Lab, Changwon National University
투시 투영
• 투시 투영의 종류
소실점
(a) 삼점투시
IVIS Lab, Changwon National University
두 축 방향이 투영면에 평행
(b) 이점투시
(c) 일점투시
7.6.1 One-,Tow-, and Three-Point Perspective
• 투시 투영은 일점, 이점, 삼점 투시로 나뉘어짐
– 그림과 같이 한 꼭지점이 원점에 있고 크기가 1인 단위입방체를 고려
해 보자
– 각 모서리는 세계 좌표계의 축에 정렬되어 있으며 이를 주축(Principal
axes)이라 하자. 이 축은 i, j, k 벡터 방향에 있음
– x=0, y=0, z=0인 여섯 개의 주면(Principal planes)을 고려
IVIS Lab, Changwon National University
7.6.1 One-,Tow-, and Three-Point Perspective
• 카메라는 무한히 많은 방식으로 둘 수 있음
– 이들 중에서 카메라의 n축은 한 축이나 다른 축에 직교한다
• 투시 투영은 주축이 만들어 내는 무한한 소실점의 개수를 헤아려서
만든다
• 만일 직선이 n에 직교한다면 그 소실점은 무한대의 위치에 있다
• 그렇지 않을 경우 유한하다
IVIS Lab, Changwon National University
7.6.1 One-,Tow-, and Three-Point Perspective
• One-, two-, and three-point perspectives
– how many of the three principal directions in the object are
parallel to the projection plane
– vanishing points
three-point
perspective
IVIS Lab, Changwon National University
two-point
perspective
one-point
perspective
7.6.1 One-,Tow-, and Three-Point Perspective
• One-, two-, and three-point perspectives
– how many of the three principal directions in the object are
parallel to the projection plane
– vanishing points
three-point
perspective
IVIS Lab, Changwon National University
two-point
perspective
one-point
perspective
7.6.1 One-,Tow-, and Three-Point Perspective
• One-, two-, and three-point perspectives
– how many of the three principal directions in the object are
parallel to the projection plane
– vanishing points
three-point
perspective
IVIS Lab, Changwon National University
two-point
perspective
one-point
perspective
7.6.1 One-,Tow-, and Three-Point Perspective
• One-, two-, and three-point perspectives
– how many of the three principal directions in the object are
parallel to the projection plane
– vanishing points
three-point
perspective
IVIS Lab, Changwon National University
two-point
perspective
one-point
perspective
일점 투영
• 일점 투영은 하나의 유한한 소실점을 가진다
• n은 i,j,k 방향과 수직할 필요는 없으나 다른 두 방향에
대하여 수직하며, 따라서 주면 중의 하나와 직각을 이
룬다
IVIS Lab, Changwon National University
7.6.1 One-,Tow-, and Tree-Point Perspective
• 이점 투영
– 카메라의 n 방향의 두 축은 직각이 아님
– 한 축은 직각
– n = (sin(θ) , 0, cos(θ) )
IVIS Lab, Changwon National University
7.6.1 One-,Tow-, and Tree-Point Perspective
• 삼점 투영
– Vector n is not perpendicular to any axes
IVIS Lab, Changwon National University
7.6.2 평행 투영
• 관측 볼륨을 만드는 glOrtho() 함수는 이미 살펴보았음
• 투시투영에서 장면내의 모든 점은 눈의 위치에 수렴하는 투영선을 따
라 관측면에 투영된다는 점을 알고 있다
• 반대로 평행투영은 눈의 위치와 상관 없이 동일한 투영선을 가진다는
것을 알 수 있다(그림에서 P와 Q는 벡터 d에 평행하게 투영됨)
IVIS Lab, Changwon National University
7.6.2 Parallel Projections
• Oblique: the projection direction d is not parall to n
• Orthographic: the projection direction d is parallel to n.
IVIS Lab, Changwon National University
7.6.2 Parallel Projections
• 직교투영의 유형
– 다면 직교 투영(Multiview Orthographic Projections)
• 투영면이 하나의 주면에 평행
• 투영선이 투영면에 수직
– 거리와 각이 보존
– 제도 작업에 적합
IVIS Lab, Changwon National University
7.6.2 Parallel Projections
• Axonometric Views
– n은 더 나은 삼차원 장면을 만들기 위하여 사용됨
– n은 대게 임의의 주축에 대하여 평행하지 않으며 n은 세 인접 오브젝
트의 면이 보일 수 있도록 한 방향에 있다
• Foreshortening factor : length of sin(α)
– How many principal axes are equally foreshortened
1.Isometric(equal measure) : All
2.Dimetric(two measures) : Two
3.Trimetric (three measures) : All not
IVIS Lab, Changwon National University
7.6.2 Parallel Projections
• 아이소메트릭 자리표계에서는 정육면체의 3 면이 같은 넓
이로 보이는 각도로 사물을 바라본다.
– iso(같은)metric(측도)이란 이 3면이 같은 넓이가 된다는 뜻이다.
• Isometric Views
– nx =±ny =±nz
– Principal axes are equal
투명한 정육면체의 아
이소메트릭뷰는 세 개
의 대각선을 가진 육면
체 모양임
IVIS Lab, Changwon National University
Isometric Views
•
이 시각(문자 그대로 보는 각도)은 게임세계(비유적인 뜻으로 세계)의 세계관
(문자 그대로의 관점)이다.
– 아이소메트릭 관점은 오른쪽으로 45도 돌아 간 다음 35.27도 위로 올라서서 아래
로 내려다 보는 관점이다. 여기서 원근법은 사용하지 않는다. 위에서 35.27도 어
1
떻게 나왔는지 궁금해 할 사람이 있을 것이다. 이 각도는 sin (1 / 3 ) 값이다.
•
이 시각은 블리자드사가 다이아블로를 풀그림하면서 널리 퍼뜨려 초기의 3D
게임은 거의 이 표시법을 따르게 되었다. 이 기법으로 게임 프로그램 짜는 기
법을 가르치는 책까지 나올 정도로 보편화되었다.
– 아래의 그림은 이 기법으로 제작한 게임의 스크린샷
디아블로 2
IVIS Lab, Changwon National University
7.6.2 Parallel Projections
• Dimetric Views
– 두개의 축만이 n과 동일한 각을 만들 겨우 이 관측을
dimetric view라고 한다
– 디메트릭 뷰에서 두 방향의 코사인은 반드시 동일한 크기를
가져야 한다
IVIS Lab, Changwon National University
7.6.2 Parallel Projections
• Trimetric Views
– 세 축이 n과 다른 각을 가짐
IVIS Lab, Changwon National University
경사투영
• 경사투영은 오브젝트의 한면에 대한 정확한 형태를 보존
– 삼차원적인 특성을 나타내지 못함
– 액소노메트릭 투영은 삼차원 품질을 보여줌
– 경사투영은 직교투영과 경사투영의 장점을 결합
• 평행투영에서 투영 방향이 투영면과 수직이 아니고 일정
한 각도를 이룬다
IVIS Lab, Changwon National University
경사투영
• 투영선이 투영면과 임의의 각을 가짐
• 투영면과 평행한 주면의 각이 보존
투영면
투영면
(a)경사투영의 구성
IVIS Lab, Changwon National University
투영면
(b)평면도
(c) 측면도
경사투영
• 경사 투영
– 관측 평면이 창고의 뒤쪽에 있는 그림
– 창고의 전면의 크기 r은 그대로 보존되지만 측면 s는 shearing
된 결과로 만들어진 것이다
IVIS Lab, Changwon National University
경사투영
• 그림에 있는 것 중에서 왼쪽 그림과 같은 투영은
Cavalier라는 이름을 가진다
– Cavalier : dx = dy = dz
• 오른쪽은 Cabinet이라는 이름을 가진다
– Cabinet : dx = dy = dz/2
IVIS Lab, Changwon National University
경사투영
• OpenGL은 경사 투영을 자체적으로 지원하지 않는다
– glOrtho()는 직교 투영을 지원함
– shearing을 이용해서 경사 투영을 만들 수 있다
IVIS Lab, Changwon National University
끝