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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过鼠标点击获得鼠标点的三维世界坐标呢?OPENGL相关的知识,希望对你有一定的参考价值。

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

参考技术A 鼠标点只有二维的位置。屏幕哪有z值?除非你是想在三维空间中拾取,但是鼠标的位置也是二维的。只不过你可以根据比较鼠标拾取到的对象的深度,来判断拾取到的是哪个对象。
获取二维位置我倒是知道:如果你用的是红宝书上的那种程序结构,也就是控制台程序,那么你就可以调用glutMouseFunc(void(*func)(int button,int state,int x,int y))在你的main里面注册一个函数func 得到鼠标的状态和位置,如果你用的是NEHE那种程序结构,你就使用windows的WM_LBUTTONDOWN等来获取鼠标位置了。
参考技术B 鼠标在屏幕上点击可获取一个二维坐标,映射到三维场景中其实就像一条射线,不可能是一个特定的点,除非你已确定深度值!若想要选择某个物体,只要判断是否之前射线相交,在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);//获得此射线上命中图元数量
参考技术C 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);
本回答被提问者采纳

怎么在matlab中鼠标在坐标图上单击,记录下这一点的坐标啊

怎么在matlab中鼠标在坐标图上单击,记录下这一点的坐标啊

首先画图
然后使用ginput函数获得鼠标点击位置信息

[x,y] = ginput;

当鼠标在figure上点击后,函数就会返回点击位置的坐标x,y
参考技术A 要获取图片上点的坐标,可点击 datacursor工具,在图形中选点一下,出现坐标及颜色值,可右击出菜单,选Export cursor data to workspace输出到工作间等多种选择。 参考技术B ginput函数啊 a = ginput(1); a保存了点击的坐标
函数用法
b = ginput(c);
c代表可点击次数,b则保存了每一次点击的坐标。
如果不输入c,则默认一直执行点击记录操作
参考技术C [u,v]=ginput(5)
[u,v]中存放数据就是所取5个点的坐标。

以上是关于如何通过鼠标点击获得鼠标点的三维世界坐标呢?OPENGL的主要内容,如果未能解决你的问题,请参考以下文章

三维坐标系下,python如何获取鼠标点击事件,返回三维坐标x,y,z?

怎么在matlab中鼠标在坐标图上单击,记录下这一点的坐标啊

Cesium 获取鼠标点击坐标及世界坐标与弧度(经纬度)转换

QT如何获取窗口外的鼠标点击事件,或者鼠标坐标

python 五子棋 获得鼠标左键点的坐标

在three.js中获取鼠标点击点的3D坐标