3차원 물체를 그려지는 과정

 

컴퓨터 모니터는 평면이기 때문에 렌더링 된 3D 장면들은 

2D 이미지로 컴퓨터 스크린에 투영되어야 한다.

 

스크린에 표시되기 까지 아래 변환 과정이 필요하다.

 

월드 변환 -> 카메라 변환 -> 투영 변환 순서

즉 오브젝트 공간 -> 월드 공간 -> 카메라 공간 -> 클립 공간

 

그 중에서 투영 변환은 월드의 모든 물체를 카메라 공간으로 이동시킨 뒤,

 2차원 평면으로 그려주기 위한 변환이다.

 

 

클리핑 : 절두체의 경계에 걸치게 되면 걸쳐진 바깥쪽 부분은 잘려 버려지게 되는 것 (클립 공간에서 수행)

 

월드 변환

 

오브젝트 공간은 3차원 세상에서 표현될 각각의 오브젝트들이 정의된 공간이다.

하나의 물체가 자신만의 공간에서 고정 불변의 좌표를 가지는 것이라고 생각할 수 있다. 

이러한 오브젝트 공간의 물체는 다른 오브젝트의 공간과 전혀 관계가 없기 때문에 3차원 세상에서 표현하고자

하는 모든 오브젝트들은 하나의 단일 공간으로 변환 할 필요가 있다. 

 

이 때 모든 대상들이 모아질 공간을 월드 공간이라 하고, 각각의 대상을 월드 공간에 모으는 과정을 월드 변환이라 한다.

 

 

카메라 변환(뷰 공간 / 카메라 공간)

 

모든 물체가 월드 공간에 모아지면 카메라가 볼 수 있는 영역의 공간을 뷰 공간이라고 한다. 월드 공간의 모든 물체를 카메라 공간으로 변환하게 되면 보다 효율적인 랜더링 알고리즘을 설계할 수 있기 때문에 이 카메라 변환이 필요하다.

 

 

투영 변환

 

투영 변환은 이러한 원근법을 구현하기 위해 카메라 공간에서 정의된 절두체를 축에

나란한 직육면체 볼륨으로 변경하여 카메라 공간의 모든 물체를 3차원 클립 공간으로 변환하는 것을 의미한다.

 

여기서 투영 변환이라는 이름과 달리 3차원 카메라 공간의 물체를 2차원 평면으로 투영하는 것이 아니라 

또 다른 3차원 물체로 '변형'이다.

이 물체들은 관찰해보면 절두체 뒤쪽에 있던 영역의 폴리곤은 상대적으로 작아진다.(원근법 적용)

 

투영변환을 통해 원근법이 적용된 3차원 물체들은 직육면체 볼륨의 3차원 클리핑 공간으로 정의되어있다.

그러나 최종적으로 필요한 것은 2차원 사각 영역이다.

 

3차원을 2차원 공간으로 변환이 필요한 것이다. (단순히 z값을 버린 면? 원근법이 적용이 불가)

 

바로 Z좌표로 모든 성분을 나눠버리면?

실제 Z값은 투영 변환행렬을 곱한 후 동차좌표계의(x,y,z,w)에서 w성분에 저장되어 있기 때문에 투영변환 이후 w에 저장된 값을 좌표를 나누는 것이다.

 

나눗셈을 하고 나면 (x, y, z, w)의 동차 좌표 게에서 (x, y, z)의 직교 좌표계로 변화하게 되는데 이를 NDC공간이라고 하는 것이다.(NDC공간은 좌표의 XY범위가 [-1,1]이고, Z범위가 [0,1]이다.)

 

 

 

뷰포트 변환

 

컴퓨터 화면 상의 윈도는 스크린 공간을 갖는데, 이 스크린 공간 내에 2차원 이미지가 그려질 뷰포트가 정의되는데 NDC공간의 물체들을 스크린 공간으로 이전시키는 변환을 뷰포트 변환이라 한다. 

 

 

 

 

 

  출처 http://www.songho.ca/opengl/gl_projectionmatrix.html

https://jidon333.github.io/blog/Rendering-pipeline

+ Recent posts