- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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函数里用类似的方法得到即时的在红色平面的投影坐标值,并把这
您可能关注的文档
最近下载
- GXG 451-2016 信息通信建设工程费用定额 信息通信建设工程概预算编制规程.pdf VIP
- 气管插管配合操作流程.docx VIP
- 血管内超声(IVUS)光学相干断层扫描成像(OCT)培训学习讲解PPT课件.pptx VIP
- Unity 2D游戏开发实战-坦克大战.pptx VIP
- 2025中国中医科学院中医药健康产业研究所 (江西中医药健康产业研究院) 招聘事业编制人员18人考试备考试题及答案解析.docx VIP
- 2025年森林防火道路建设项目可行性研究报告.docx
- 计算机组成原理(第六版,立体化教材)(白中英,戴志涛)课后习题答案.docx VIP
- 血细胞形态学课件.pptx VIP
- 古诗词对句.doc VIP
- 《时频分析技术》课件.ppt VIP
文档评论(0)