如何从屏幕坐标获的3D坐标-OpenGL? 我需要用鼠标来改变3D物体,我需要知道鼠标如何转换成某1d或2d固定的三维坐标。不知道有什么办法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个是有点麻烦,你看看NEHE教程 第48课吧,这个研究明白了就什么都明白了~ // »ñÈ¡¹â±êλÖõÄÄ£ÐÍ×ø±ê¡£ 2002.11.18.CPoint3D CCity3DView::GetMouseModelCoordinate(CPoint point){ GLfloat fdepth; CPoint3D pp; glReadPixels(point.x, pDoc->Env.iViewPort[3]-point.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &fdepth); gluUnProject((GLdouble)point.x, (GLdouble)(pDoc->Env.iViewPort[3]-point.y), (GLdouble)fdepth, pDoc->Env.dModelMatrix, pDoc->Env.dProjMatrix, pDoc->Env.iViewPort, &pp.x, &pp.y, &pp.z); return pp;} syy64(太平洋):可以理解你的方法。至少我以前不知道有这样的函数存在,谢谢。但是问题是我希望鼠标的移动来改变3维物体的移动,也就是说,鼠标移动到那个点时framebuffer的depth并不是我将物体移动过去的depth.你这样的做法,只能说我点到那个有效的3维坐标。 shl6894(越学越无知):没有NEHE教程,我正式开始接触3D也就2个月左右,OpenGL的东西大概知道个原理,估计也没有很多的时间来看各种各样的教程。能不能简单的介绍一下你了解的方法。 谢谢大家的帮助,从3维的原理看这个事情是可以做的。我的理解正向运算的方法是,1。通过我目前的物体坐标,我可以知道安某个方向的移动的屏幕直线变化方向。2。将鼠标点投影到这个平面直线,可以得到移动的鼠标点。3。通过这个鼠标点,应该可以获得一个三维的直线或线条。这条线上的所有点都会显示在这个屏幕点上。4。这个线和物体移动的线条的交点就是这个物体应该移动的位置。但是这里的3和4并不是非常的容易。不知道我是不是该花时间去试这个算法。特别是如果误差导致两条线无法相交,要考虑很多各种问题。可能也是我接触时间不长,没有大量的算法积累的缘故。我同样考虑用OpenGL的feedback模式加上2分法解方程来获得这个点。这个方法一定可以获得一个接近点。我不知道有没有向syy64(太平洋)提到的那样的已有的可行的简单方法? syy64(太平洋):你的第一步是获得深度信息。但是鼠标点的深度信息和物体移到同一屏幕坐标时的深度是不一样的。不过你的函数还是有用,起码我现在可以不用反馈(feedback)模式来找位置,方便多了。 假设物体在(0,0,0)的位置上,对应的鼠标点是0,0当鼠标移动到(20,20),我不可能直接取(20,20)的深度。这个地方可能深度是最大值。也可能是0。而我的物体时按照一定的要求移动到这个点,比如x,y不变。这样移动到这里的z,应该是固定的。如果还是不理解,我不知道如何给你解释了。我刚想到可能可以利用Selection模式(可能就是shl6894(越学越无知)提的)来获得这个坐标,先试试再说。方法大概如下,先画一条线(x,y,Zn-Zm),或一个平面(x, dy, dz). 然后用selection的方法取到鼠标点的深度(线或平面的深度)。然后可以直接移动到这个深度。 “武汉理工大学有一个人写过一篇关于鼠标拣选的文章“””呵呵,那个教程是俺写的在GameRes.com的技术文档里面搜索“鼠标拣选”就能找到了 我几乎没怎么上过csdn偶尔一上来竟看到有人提起很久以前写的文章:) 问题解决,最终没有用Selection的方法。主要是偷懒了,加上我只在一个方向上移动,以后再试到底哪种比较快。方法大概是用gluProject加上逼近的方法解出变化的位置。做完后拜读了一下那片文章。作者对OpenGL的理解很有意思。如果这样的东西是当作论文发表实在是不敢恭维。 哈哈哈不值一哂这个是套当时的文档模板写给系里同学交差的没想过要发表:)倒是后来有几篇terrain rendering的发表了顺便啰嗦一句在国内这种大环境下想要搞research还是很需要一番功力的我的几个搞research的好朋友都出国了 connect 10061是怎么回事? 程序没有错误但是不能运行 怎样把MFC60动态链接库添加到程序文件中 请问vc和dephi可以共用dll吗? 新手提问:请问几个困惑已久的问题... VS.net不能调试SQL!有经验者快进,立即结帖 怎样检索一个对话框上的ip address control的ip地址,高手请指点! 请问怎样在clistctrl里显示jpeg图片的缩略图呢 拷贝文件的问题 关于CHtmlView的问题,大家来帮忙!!! 像vc编辑器中在关键字上鼠标停留几秒钟就出现的黄色的矩形提示框是怎么实现的呢 多语言-泰文的显示
CPoint3D CCity3DView::GetMouseModelCoordinate(CPoint point)
{
GLfloat fdepth;
CPoint3D pp; glReadPixels(point.x, pDoc->Env.iViewPort[3]-point.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &fdepth);
gluUnProject((GLdouble)point.x, (GLdouble)(pDoc->Env.iViewPort[3]-point.y), (GLdouble)fdepth, pDoc->Env.dModelMatrix, pDoc->Env.dProjMatrix, pDoc->Env.iViewPort, &pp.x, &pp.y, &pp.z);
return pp;
}
1。通过我目前的物体坐标,我可以知道安某个方向的移动的屏幕直线变化方向。
2。将鼠标点投影到这个平面直线,可以得到移动的鼠标点。
3。通过这个鼠标点,应该可以获得一个三维的直线或线条。这条线上的所有点都会显示在这个屏幕点上。
4。这个线和物体移动的线条的交点就是这个物体应该移动的位置。但是这里的3和4并不是非常的容易。不知道我是不是该花时间去试这个算法。特别是如果误差导致两条线无法相交,要考虑很多各种问题。可能也是我接触时间不长,没有大量的算法积累的缘故。我同样考虑用OpenGL的feedback模式加上2分法解方程来获得这个点。这个方法一定可以获得一个接近点。我不知道有没有向syy64(太平洋)提到的那样的已有的可行的简单方法?
当鼠标移动到(20,20),我不可能直接取(20,20)的深度。这个地方可能深度是最大值。也可能是0。而我的物体时按照一定的要求移动到这个点,比如x,y不变。这样移动到这里的z,应该是固定的。如果还是不理解,我不知道如何给你解释了。我刚想到可能可以利用Selection模式(可能就是shl6894(越学越无知)提的)来获得这个坐标,先试试再说。方法大概如下,先画一条线(x,y,Zn-Zm),或一个平面(x, dy, dz). 然后用selection的方法取到鼠标点的深度(线或平面的深度)。然后可以直接移动到这个深度。
在GameRes.com的技术文档里面搜索“鼠标拣选”就能找到了
偶尔一上来
竟看到有人提起很久以前写的文章:)
最终没有用Selection的方法。主要是偷懒了,加上我只在一个方向上移动,以后再试到底哪种比较快。
方法大概是用gluProject加上逼近的方法解出变化的位置。做完后拜读了一下那片文章。作者对OpenGL的理解很有意思。如果这样的东西是当作论文发表实在是不敢恭维。
不值一哂
这个是套当时的文档模板写给系里同学交差的
没想过要发表:)倒是后来有几篇terrain rendering的发表了
顺便啰嗦一句
在国内这种大环境下想要搞research还是很需要一番功力的
我的几个搞research的好朋友都出国了