OpenGL坐标显示问题 用c++在Opengl平台实现的三维物体的显示,下面要实现一个功能:即,三维体的三维坐标点信息是已经知道存在的,不需要计算,要实现当鼠标放在三维体中的某一点上时,同时显示这一三维点的坐标信息,该怎么实现呢?望高位高手指导! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不知道OpenGL的GL_SELECT绘图模式能不能点拾取,楼主可以试试(可以参考一下讲拾取的文章,比如这个:http://jerome.jouvie.free.fr/OpenGl/Tutorials/Tutorial27.php)。如果不行的话还有个思路:需要进行拾取判断的绘制时把三维物体的贴图啊,混合什么的都关了,然后把所有点都给上一个唯一的颜色值,用点模式绘制,然后用glReadPixels结合鼠标位置取颜色,看取出来的是什么颜色就是对应的哪个点。 GLint iViewPort[4]; GLdouble dModelMatrix[16]; GLdouble dProjMatrix[16]; GLfloat winX, winY; glPushMatrix();glGetIntegerv(GL_VIEWPORT, iViewPort); //获得视glGetDoublev(GL_MODELVIEW_MATRIX, dModelMatrix); //获得视图模型矩阵glGetDoublev(GL_PROJECTION_MATRIX, dProjMatrix);//获得投影矩阵glPopMatrix(); winX = (float)pointx; winY = (float)iViewPort[3] - (float)pointy;glReadPixels(winX,//x坐标 int(winY),//y坐标 1,1,//读取一个像素 GL_DEPTH_COMPONENT,//获得深度信息 GL_FLOAT,//数据类型为浮点型 &winZ);//获得的深度值保存在winZ中 gluUnProject((GLdouble)winX,(GLdouble)winY,(GLdouble)winZ,dModelMatrix,dProjMatrix,iViewPort,&posX,&posY,&posZ); 为什么我这样得到的三维坐标点不正确呢? 我开始说的用唯一颜色直接画所有的点就可以保证,只要是光栅化后留在framebuffer上的像素点,read鼠标位置回来的像素点的颜色就是画的时候指定的颜色,也就是鼠标位置的点。 那就是用画点时得用glRendModel设为选择模式吧?而且选择模式返回的只是标记的名字啊,不能返回坐标信息啊?如果用gluUnProject函数的话又该怎么实现呢?有什么要特别注意的地方呢 gluUnProject这个我没用过。点的坐标不是你绘图时提交的数据么?为每个点配上一个唯一的颜色,然后再光栅化后查看鼠标位置的像素点的颜色,然后再反查一遍是哪个点的不就有坐标信息了? http://library.forum.nokia.com/index.jsp?topic=/S60_5th_Edition_Cpp_Developers_Library/GUID-441D327D-D737-42A2-BCEA-FE89FBCA2F35/OpenGLEx/PickSelect/doc/a_pick_select_8cpp-source.html这个是nokia的opengl es拾取实例,性质类似,你可以参考一下。这个拾取的时候画不带贴图等状态的处理只是针对判断鼠标位置的点用的,并不会被实际显示在屏幕上,所以不会影响实际表现。 机房 U盘 禁止玩游戏 VC6.0如何编写activeX控件供VB工程使用 关于MFC中的类 有没有关于换skin方面的技术文章? 如何在运行时将 CSpinButtonCtrl 从默认的垂直风格改为水平(UDS_HORZ)风格? MFC为什么老是喜欢用_tmain这样的别名? 怎样向数据库的一张表中添加一条记录? 利用辗转相除法求两个多项式的最大公因式的函数(用C语言) 。 对于任意一段数据,插入一段flag数据,怎么样才能保证正确被检测出来? 要有支持游标功能的图表程序,不知哪有现成的东西? 用VC做哦! MFC多文档显示问题 关于VC++/mfc中单选按钮选择问题!
如果不行的话还有个思路:需要进行拾取判断的绘制时把三维物体的贴图啊,混合什么的都关了,然后把所有点都给上一个唯一的颜色值,用点模式绘制,然后用glReadPixels结合鼠标位置取颜色,看取出来的是什么颜色就是对应的哪个点。
GLdouble dModelMatrix[16];
GLdouble dProjMatrix[16];
GLfloat winX, winY;
glPushMatrix();
glGetIntegerv(GL_VIEWPORT, iViewPort); //获得视
glGetDoublev(GL_MODELVIEW_MATRIX, dModelMatrix); //获得视图模型矩阵
glGetDoublev(GL_PROJECTION_MATRIX, dProjMatrix);//获得投影矩阵
glPopMatrix();
winX = (float)pointx;
winY = (float)iViewPort[3] - (float)pointy;
glReadPixels(winX,//x坐标
int(winY),//y坐标
1,1,//读取一个像素
GL_DEPTH_COMPONENT,//获得深度信息
GL_FLOAT,//数据类型为浮点型
&winZ);//获得的深度值保存在winZ中
gluUnProject((GLdouble)winX,(GLdouble)winY,(GLdouble)winZ,dModelMatrix,dProjMatrix,iViewPort,&posX,&posY,&posZ);
为什么我这样得到的三维坐标点不正确呢?
如果用gluUnProject函数的话又该怎么实现呢?有什么要特别注意的地方呢
这个是nokia的opengl es拾取实例,性质类似,你可以参考一下。
这个拾取的时候画不带贴图等状态的处理只是针对判断鼠标位置的点用的,并不会被实际显示在屏幕上,所以不会影响实际表现。