OpenGL

[OpenGL-7] Projection Matix

zamezzz 2016. 12. 31. 22:08

안녕하세요.


일곱번째 포스팅입니다 ^^


오늘은 Projection Matrix라는 개념에 대해서 정리해볼까 합니다.


* 요구사항 *

7.1. Projection Matrix

7.2. Parallel Projection

7.3. Perspective Projection




  7.1 Projection Matrix


Projection Matrix가 무엇일까요?


Projection이란 투사, 투영이라는 뜻입니다.


쉽게 말해 원근감을 어떻게 표현할 것인지에 대한 부분을 정하는 부분이라고 생각하시면 되요.


이후 3차원 좌표를 우리의 2D 모니터로 투영시키는 것이 Projection Matrix의 역할입니다.


한번 투영된 이후에는 z 값이 사라지므로 역산을 할 수는 없습니다.


크게 2 가지의 Projection으로 나뉘어 지는데요.

- Parallel Projection

- Perspective Projection


뒤에 있는 물체를 크기변환 시킬 것인지, 안 시킬 것인지가 위 2가지의 차이입니다.


먼저 Parallel Projection 부터 알아보겠습니다.


  7.2 Parallel Projection


Parallel Projection 평행으로 투영하는 방식을 뜻합니다.

(OpenGL 라이브러리에서는 Orthographic 이라고 표현합니다. 직교라는 뜻이에요)


아래 그림과 같이 실제 모델 좌표계에서 2D 화면으로 보낼 때 평행선으로 객체가 보내어지면


Parallel Projection이라고 쉽게 판단할 수 있습니다.



평행 투영에는 장점과 단점이 모두 존재합니다.


먼저, 장점


- 평면도를 그릴 수 있습니다. (건축에서 청사진을 그릴 때 활용)

- 상대적인 크기를 알 수 있다.

- 구현하기 쉽다.


단점


- 사실적이지 않다.

- 뒤에 있나 앞에 있나 물체의 크기가 같다. 잘못된 인지를 만들 수 있다.

- 아래 사진은 Penrose stairs라 불리는 불가능한 객체를 보여줍니다.


구현하는 방법에 대해 알아보겠습니다.


clipping 크기를 정규화시키는 방법을 주로 사용하는데요. 이를 위해 행렬 변환을 사용합니다.


크게 2가지 단계로 나뉘어져요.




1. 원점 이동

이동 변환을 통해 원점으로 이동합니다.

원점으로 이동하는 행렬은 다음과 같습니다.


Translate(-(left+right)/2, -(bottom+top)/2, near/2)


2. x, y는 2로 / z는 1로 스케일 변환


Scale(2/(left-right), 2/(top-bottom), 1/(far-near))


두 변환을 각각 계산후 행렬 곱을 통해 최종 Orthogonal Matrix를 생성할 수 있답니다.


예제로 만든 Ortho 함수는 아래와 같으니 참고해주세요.


mat4 Ortho(float left, float right, float bottom, float top, float near, float far)

{

mat4 T = Translate(-(left+right)/2, -(top+bottom)/2, near/2);

mat4 S = Scale(2/(left-right), 2/(top-bottom), 1/(far-near));

mat4 V = S*T;


return V;

}




  7.3 Perspective Projection


Perspective Projection은 원근법을 적용하여 객체를 표현하는 방식입니다.


위 사진을 보시면 이해가 쉬우실 것 같아요.


평행 투영이 그대로 평행선을 따라 투영되는 반면에, 원근 투영은 실제 비율에 맞추어서


사실과 같은 크기로 객체가 그려지게됩니다.


Perspective Projection 구현을 위해서는 삼각형의 닮음을 이용합니다.



원하는 scale에 Unhinging을 해주면 Perspective Projection이 완성됩니다.


Unhinging이란 View-Volume을 아래 그림처럼 펴주는 것을 말합니다.




Unhinging에 xyz의 Scale이 적용되면 Perspective Projection이 완성됩니다.


행렬식은 아래와 같습니다.



Orthogonal과 같이 mat4 함수를 만들고 이를 계산하여 V를 return해주면 됩니다.


행렬식을 알면 구현하는 것은 크게 어렵지 않습니다.





한 번 개념을 이해하고 코드를 이해하신다면, 어려우시지 않을 거에요.


처음이 어렵긴합니다...


읽어주셔서 감사합니다.


다음에는 Light에 대해서 정리해보겠습니다.

반응형

'OpenGL' 카테고리의 다른 글

[OpenGL-9] object viewer 구현하기 (1)  (13) 2017.04.06
[OpenGL-8] Lighting  (0) 2017.03.16
[OpenGL-6] Model View Matrix  (2) 2016.11.13
[OpenGL-5] Cube Control Program  (1) 2016.11.02
[OpenGL-4] Callback and Transformation  (0) 2016.10.30