About gluUnProject
Post

About gluUnProject

Projection은 3D World Space상에 있는 Objects를 2D 화면상에 “투영” 하는 것으로써, 3D Vertex -> [Projection Matrix -> ModelView Matrix] -> 2D Vertex 로 변환되는 과정이다.

3차원이 2차원으로 변환되면서 x, y, z 성분 중 z 성분이 사라지게 되는데, “엄밀히 말하면 사라지는 것”이 아니라 Depth 라는 값으로 변환되는 것이다(여기서 말하는 z 성분이란, Viewer의 Front Vector를 기저로 하는 벡터).

OpenGL에서는 어느 픽셀의 Depth값을 읽어 낼 수 있는 함수가 있다.

1
2
3
4
5
6
7
8
9
10
float depth;
int pixel_x = 1 // 픽셀의 x 좌표
int pixel_y = 1 // 픽셀의 y 좌표
glReadPixels(
    pixel_x, pixel_y,
    1, 1,
    GL_DEPTH_CONPONENT,
    GL_FLOAT,
    &depth
);

를 사용하면, 화면상 좌표(pixel_x, pixel_y) 픽셀의 Depth를 얻을 수 있다.

만약 아무것도 렌더링 되지 않은 곳의 Depth를 얻으려고 한다면 dept의 값은 1이 된다.

이제 이것으로 화면상의 2 Space 좌표(x, y)를 이용하여, 3D Space 상의 좌표(x, y, z)를 얻을 수 있다.

1
2
3
4
5
6
double x, y, z;
gluUnProjectect(
    픽셀위치X, 필셀위치Y, XY픽셀의depth,
    뷰행렬, 프로젝션행렬, 뷰포트,
    &x, &y, &z
);

마지막 3개의 매개변수에 3D 상의 한 점이 담기게된다.

뷰행렬을 얻는 방법은,

1
2
double view[16];
glGetDoublev(GL_MODELVIEW_MATRIX, view);

프로젝션 행렬은

1
2
double proj[16];
glGetDoublev(GL_PROJECTION_MATRIX, proj);

뷰포트는

1
2
int vp[4];
glGetIntegerv(GL_VIEWPORT, vp);

이다.