본문 바로가기
Computer/JOGL

About gluUnProject

by DogBull 2008. 2. 2.

Projection은 3D World Space상에 있는 Objects를 2D 화면상에 "투영" 하는 것.

3D Vertex -> [Projection Matrix -> ModelView Matrix] -> 2D Vertex

로 변환되는 과정이다.

3차원이 2차원으로 변환되면서, x, y, z 성분 중 z 성분이 사라지게 되는데,

(여기서 말하는 z 성분이란, Viewer의 Front Vector를 기저로 하는 벡터)

"엄밀히 말하면 사라지는 것"이 아니라, Depth 라는 값으로 변환되는 것.

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

float depth;
glReadPixels( 픽셀위치X, 픽셀위치Y,
                    1, 1,
                    GL_DEPTH_CONPONENT, GL_FLOAT,
                    &depth);

를 사용하면,
화면상의 X,Y 픽셀의 Depth를 얻을 수 있다.

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

이제 이것으로, 화면상의 2차원 좌표( 대개는 마우스의 위치에 대한 )를 이용하여,

3D Space 상의 한 점을 얻을 수 있는 모든 정보를 갖게된 셈이다.

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

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

뷰행렬을 얻는 방법은,
double view[16];
glGetDoublev(GL_MODELVIEW_MATRIX, view);

프로젝션 행렬은
double proj[16];
glGetDoublev(GL_PROJECTION_MATRIX, proj);

뷰포트는
int vp[4];
glGetIntegerv(GL_VIEWPORT, vp);

이다.

'Computer > JOGL' 카테고리의 다른 글

JOGL - Applet based Omnidirectional Panorama  (0) 2010.10.16
Geometry  (0) 2007.08.15
11. Java Web Start  (0) 2007.08.06
glut  (0) 2007.08.06
10. GLSL -- Texture  (0) 2007.08.03