关于鼠标屏幕坐标转3D空间坐标的问题.docVIP

关于鼠标屏幕坐标转3D空间坐标的问题.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于鼠标屏幕坐标转3D空间坐标的问题

小弟我最近遇到一个问题,用opengl和MFC画图,搭建好MFC下的opengl画图环境后,首先在3D空间画了一个平面: glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLoadIdentity(); glTranslated(0.0,-1.0,-30.0); glRotatef(x_angle, 1.0, 0.0, 0.0); //x_angle可以设置为任何值;一开始不妨设为0;后面还要用到此变量。 glColor3f(1.0, 0.0, 0.0);? glBegin(GL_POLYGON); glVertex3f(-10, -5, 15); glVertex3f(10, -5, 15); glVertex3f(10, -5, -15); glVertex3f(0, -5, -25); glVertex3f(-10, -5, -15); glEnd(); 以上代码是画平面,在ONDRAW()里调用,编译后即可看到红色的平铺的一个平面; 然后在菜单中增加一项:用鼠标来画线的菜单选项,响应函数如下: void CMYView::Onstraight() { // TODO: 在此添加命令处理程序代码 m_straight=true; //这个BOOL变量用来判断是不是点了这个菜单选项; } 接着在鼠标左键响应函数里添加: void CtestView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if(m_straight) { m_startpt=point; glPushMatrix(); glTranslated(0.0,-1.0,-30.0); glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数,viewport在头文件中定 ? //义,得到视区的X,Y,LEFT,BOTTOM; glGetDoublev(GL_MODELVIEW_MATRIX, modelview); //得到投影矩阵 glGetDoublev(GL_PROJECTION_MATRIX, projection);//得到透视矩阵 glPopMatrix(); winX = point.x; //得到视区坐标 winY = viewport[3] - point.y;//视区坐标 ? //进行坐标转换,把wniX,winY,0.0(代表近裁减面)转化为3D空间坐标:posX,posY,posZ; gluUnProject(winX, winY, 0.0, modelview, projection, viewport, posX, posY, posZ); GLdouble nearpt[3],farpt[3]; nearpt[0]=posX; nearpt[1]=posY; nearpt[2]=posZ; ? //转化为远裁减面3D坐标 gluUnProject(winX, winY, 1.0, modelview, projection, viewport, posX, posY, posZ); farpt[0]=posX; farpt[1]=posY; farpt[2]=posZ; //得到两个裁减面之间的距离(不知道这么说对不对),然后得到3个坐标resultpt[0,1,2]; ? //这3个坐标表示的是当鼠标移动时,得到的鼠标屏幕坐标在红色平面上的投影坐标,简单说就是鼠标 发射的射线和红色平面相交的交点的3d坐标; GLdouble tmppt[3],resultpt[3]; tmppt[0]=farpt[0]-nearpt[0]; tmppt[1]=farpt[1]-nearpt[1]; tmppt[2]=farpt[2]-nearpt[2]; resultpt[0]=tmppt[0]*(-5-nearpt[1])/tmppt[1]+nearpt[0]; resultpt[1]=-5; resultpt[2]=tmppt[2]*(-5-nearpt[1])/tmppt[1]+nearpt[2]; //---------------------------- } CScrollView::OnLButtonDown(nFlags, point); } 然后就可以在onmosemove函数里用类似的方法得到即时的在红色平面的投影坐标值,并把这

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档