首先屏幕二维的原点在窗口左上角,而OPENGL的二维坐标在窗口左下角。所以Winx=point.x,Winy=Windoowheight-point.y。point是鼠标选择的屏幕上的点。再用OPENGL中的gluUnProject将屏幕点转化为三维点,因为有深度信息,所以需要Winz,也就是深度为0时,得到一个三维点,深度为1又可以得到一个三维点,相当于这两点构成一个线段,物体和此线段相交的点是我们求的点。因为我的物体是一些散乱的顶点,所以求的是哪个点距离线段最近,就是要求的点。空间点到线段的距离,我用的方法是利用三角形的周长和面积的关系。具体代码:
Line GetSelectionray(int mouse_x, int mouse_y,int height) {
// 获取 Model-View、Projection 矩阵 & 获取Viewport视区
mouse_y= height-mouse_y;
GLdouble modelview[16];
GLdouble projection[16];
GLint viewport[4];
glGetDoublev (GL_MODELVIEW_MATRIX, modelview);
glGetDoublev (GL_PROJECTION_MATRIX, projection);
glGetIntegerv (GL_VIEWPORT, viewport);
GLdouble world_x, world_y, world_z;
// 获取近裁剪面上的交点
gluUnProject( (GLdouble) mouse_x, (GLdouble) mouse_y, 0,
modelview, projection, viewport,
&world_x, &