glReadPixels(mouse_x, int(winY),1,1,GL_DEPTH_COMPONENT,GL_FLOAT, &winZ);此函数获得的WINZ一直都是1,应该是在0-1之间的啊,而且用这个方法得到的点不正确,不知道是什么原因呢?
鼠标点只有二维的位置。屏幕哪有z值?除非你是想在三维空间中拾取,但是鼠标的位置也是二维的。只不过你可以根据比较鼠标拾取到的对象的深度,来判断拾取到的是哪个对象。获取二维位置我倒是知道:如果你用的是红宝书上的那种程序结构,也就是控制台程序,那么你就可以调用glutMouseFunc(void(*func)(int button,int state,int x,int y))在你的main里面注册一个函数func 得到鼠标的状态和位置,如果你用的是NEHE那种程序结构,你就使用windows的WM_LBUTTONDOWN等来获取鼠标位置了。
鼠标在屏幕上点击可获取一个二维坐标,映射到三维场景中其实就像一条射线,不可能是一个特定的点,除非你已确定深度值!若想要选择某个物体,只要判断是否之前射线相交,在OpenGL中是通过重新定义一个视景体,然后捕获与新视景体相交的图元然后在判断,glSelectBuffer(64,selectname);//指定用于保存返回点击记录的数组glRenderMode(GL_SELECT);//进入选择模式::glInitNames();//初始化名称栈::glPushName(0);glMatrixMode(GL_PROJECTION);//选择视景体glPushMatrix();glLoadIdentity();//注意矩阵堆栈执行的顺序gluPickMatrix(m_clintmousept.x,m_clintmousept.y,1,1,viewport);//定义以鼠标位置为中心,大小为1个像素的新视景体gluPerspective(50.0F, hw, 1.0F, 1000000.0F);glMatrixMode(GL_MODELVIEW);for(int i=0;i<num;i++)//对名称栈操作{ if( i>0 && i<num )glLoadName(i); m_triList.drawObjByid(i,m_drawModel);//画出对象}glMatrixMode(GL_PROJECTION);//返回并出栈glPopMatrix();glMatrixMode(GL_MODELVIEW);int x=glRenderMode(GL_RENDER);//获得此射线上命中图元数量
void UnProject(float mouse_x,float mouse_y) //鼠标位置{ double modelview[16],projection[16]; int viewport[4]; float winX,winY,winZ; double object_x = 0,object_y = 0,object_z = 0; //3D坐标 glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, projection); glGetIntegerv(GL_VIEWPORT, viewport); winX=(float)mouse_x; winY=(float)viewport[3]-(float)mouse_y; glReadPixels(mouse_x, int(winY),1,1,GL_DEPTH_COMPONENT,GL_FLOAT, &winZ); gluUnProject((GLdouble)winX,(GLdouble)winY,(GLdouble)winZ,modelview,projection,viewport,&object_x,&object_y,&object_z);}