OpenGL的窗口坐标系是这样表示的:

 

以窗口左下角为坐标原点,往右、往上、往里分别为x,y,z轴正方向。

 

我试图完成的工作是,指定窗口上的某一点,并赋予其一个假定的深度(z坐标),然后求得该点在场景中对应的眼坐标。

 

目前我掌握的方法是调用GLuUnProject()函数。该函数定义为:

 

int gluUnProject( GLdouble winx , GLdouble winy , GLdouble winz ,

 

                  const GLdouble modelMatrix[] ,

 

                  const GLdouble projMatrix[] ,

 

                  const GLint viewport[] ,

 

                  GLdouble* objx ,

 

                  GLdouble* objy ,

 

                  GLdouble* objz );

 

参数说明:

 

1.   winxwinywinz为输入的窗口坐标

 

2.   modelMatrix是当前的模型矩阵,获得的方法是

 

GLdouble modelMatrix[16];

 

glGetDoublev( GL_MODELVIEW_MATRIX , modelMatrix );

 

3.   projMatrix是当前的投影矩阵,获得的方法是

 

GLdouble projMatrix[16];

 

glGetDoublev( GL_PROJECTION_MATRIX , projMatrix );

 

4.   viewport是当前的视口信息,按照存储于数组中的顺序依次为左上角x,y坐标、宽度及高度,获取方法是

 

GLint viewport[4];

 

glGetIntegerv( GL_VIEWPORT , viewport );

 

5.   objxobjyobjz分别是指向所求的对应坐标的指针

 

 

 

 

为了避免造成混乱,我认为在进行求解之前,应当复原模型试图矩阵。

 

这里给出整个过程的代码:

 

   4];          //4];            //

16];    //

 

16];   //

 

0.0 , 0.0 , 0.4 , modelview , project , viewport , &obj[0] , &obj[1] , &obj[2] );

 
 //