如何通过鼠标点击获得鼠标点的三维世界坐标呢?OPENGL

glReadPixels(mouse_x, int(winY),1,1,GL_DEPTH_COMPONENT,GL_FLOAT, &winZ);此函数获得的WINZ一直都是1,应该是在0-1之间的啊,而且用这个方法得到的点不正确,不知道是什么原因呢?
最新回答
挥写ヽ伱旳故事

2024-09-17 07:38:34

鼠标点只有二维的位置。屏幕哪有z值?除非你是想在三维空间中拾取,但是鼠标的位置也是二维的。只不过你可以根据比较鼠标拾取到的对象的深度,来判断拾取到的是哪个对象。
获取二维位置我倒是知道:如果你用的是红宝书上的那种程序结构,也就是控制台程序,那么你就可以调用glutMouseFunc(void(*func)(int button,int state,int x,int y))在你的main里面注册一个函数func 得到鼠标的状态和位置,如果你用的是NEHE那种程序结构,你就使用windows的WM_LBUTTONDOWN等来获取鼠标位置了。
冰月灵狐

2024-09-17 08:12:41

鼠标在屏幕上点击可获取一个二维坐标,映射到三维场景中其实就像一条射线,不可能是一个特定的点,除非你已确定深度值!若想要选择某个物体,只要判断是否之前射线相交,在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);//获得此射线上命中图元数量
心比柠檬酸

2024-09-17 01:48:25

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);
}