본문 바로가기
IT/컴퓨터 그래픽스

Perspective Projection

by 신인용 2021. 1. 18.
반응형

 

 

 

Perspective Projection

 

 

 

 

 

 

Perspective Projection

 원근법으로 멀리 있는 건 작게, 가까이 있는 건 크게 그리는 방법이다.

 

 

 

 

Projection Matrix

만약 z의 위치에 어떤 물체가 있고, 이를 View plane에 크기에 맞춰 그리려면 닮은 비를 이용하자.

 

 

 

이를 x', y', z' 으로 풀어보면

이를 행렬로 표현하면 다음과 같다.

 

 

한 예시인데, 이같은 행렬 형태로 쓰인다는 것만 알고 있자.

 

 

 

 

 

Frustum View Volume -> Normalized View Volume

Normalized Coordinates를 사용하기 위해 우선 Znear Plane과 Zfar Plane을 두고, Znear 와 Zfar를 -1 과 1 로 만들어줘야 한다.

 

Z 를 -1~1 로 만들어주는 Projection matrix이다.

이 matrix에 4번째 행에 -1이 있는 이유는 계산하려는 Z의 영역이 nagative 영역이기 때문이다.

 

 

Z를 -1~1로 만들어주었다.

Z를 -1~1 까지 만들었으면 이제 위아래도 똑같이 해줘야 한다.

즉 Clipping Window의 넓이도 -1~1로, 높이도 -1~1로 만들어주어야 한다.

 

 

 

왼쪽 Frustum View Volume에서 Perspective Mapping을 통해 오른쪽의 Parallelepiped View Volume을 만들었다고 하자.

 

 

 

그리고 Parallelepiped View Volume 을 Normalized View Volume 으로 만들어야 하는데,

(xwmin, ywmin, znear) 를 (-1, -1, -1) 로 만들고,

(xwmax, ywmax, zfar) 를 (1, 1, 1) 로 만드는 작업이다.

 

 

그래서 Z를 -1~1로 만들고, C와 D만큼 이동하여 화면의 Center에 맞춰주고, X와 Y도 -1~1로 만드는 Matrix는 이와 같이 나오게 된다.

 

 

 

 

 

OpenGL

glm::perspective(float fovy, float aspect, float near, float far)

(fovy 는 radian 단위임)

 

OpenGL 에서는 field of view Y (fovy) 라는 각도로 화면의 높이와 넓이를 구하게 됨.

mat4 projectionMatrix = glm::perspective 의 계산은 다음과 같이 이루어진다.

fH = tan(fovy/2) * near

fW = fH * aspect

projectionMatrix = glm::frustum(-fW,fW, -fH, fH, near, far)

 

 

(참고)

glm::frustum(left, right, bottom, top, near, far)

 

결과적으로 Frustum View Volume을 Normalized View Volume으로 만드는 Matrix 를 얻을 수 있다.

 

 

 

 

 

 

 

 

[참고]

Interactive Computer Graphics: A Top-Down Approach with Shader-based OpenGL 6th edition / 저자: Edward Angel, Dave Shreiner / 출판사: Pearson Education

 

 

반응형

'IT > 컴퓨터 그래픽스' 카테고리의 다른 글

Aliasing과 Anti-Aliasing  (1) 2021.02.03
Rasterization  (0) 2021.01.31
Camera Coordinates  (0) 2021.01.17
GPU와 Buffer  (0) 2021.01.17
GPU에 data를 전달하기  (0) 2021.01.17

댓글