查看: 6227|回复: 12

请问怎样计算屏幕坐标对应的空间位置!

[复制链接]

该用户从未签到

发表于 2008-3-21 10:33:57 | 显示全部楼层 |阅读模式
需要得到屏幕上某一点对应的空间坐标,请问怎么来实现,能否讲一下思路,谢谢 :)

该用户从未签到

发表于 2008-3-21 10:52:09 | 显示全部楼层
原帖由 feiyanddy 于 2008-3-21 10:33 发表
需要得到屏幕上某一点对应的空间坐标,请问怎么来实现,能否讲一下思路,谢谢 :)


屏幕上的某个点要转换到三维空间,在OpenGL中往往使用glUnProject函数;而在OSG中可以使用osgManipulator:: Projector及其派生类。即,将屏幕坐标投影到空间的某个线段,平面,圆柱面或者球面上。

转载自己发过的一个帖子~~
当我们用鼠标点击窗口的某一处时,它会在三维空间的近平面和远平面上各产生一个点。PlaneProjector类的作用就是计算这两个点连线与指定平面的交点坐标。例如,下面的代码可以计算出屏幕坐标(0,10)在平面y=z上的世界坐标。(近/远平面是我随意指定的)
  1. osg::Vec3 rtn;
  2. osgManipulator::PointerInfo pi;
  3. pi.setNearFarPoints( osg::Vec3(0,-10000,10), osg::Vec3(0,10000,10) );
  4. osgManipulator::PlaneProjector* pp = new osgManipulator::PlaneProjector;
  5. pp->setPlane( osg::Plane(osg::Vec3(0,-1,1),osg::Vec3(0,0,0)) );
  6. if ( !pp->project( pi, rtn ) ) return 1;
  7. std::cout << "X" << rtn.x() << "Y" << rtn.y() << "Z" << rtn.z() << std::endl;
复制代码

该用户从未签到

 楼主| 发表于 2008-3-21 11:35:50 | 显示全部楼层

如果我加载了一个地形,想获取鼠标点击位置的地形坐标,请问有什么办法呢!

该用户从未签到

发表于 2008-3-21 12:17:53 | 显示全部楼层
那就不用搞得那么复杂,直接问这好了~~~~~pick一下就好了~~~~~~~~~呵呵~~~~~ :) :)

该用户从未签到

发表于 2008-3-21 12:56:28 | 显示全部楼层
有一个很好用的函数:
osgViewer::View:: computeIntersections
给定X,Y值,然后OSG会自动把所有存在交点的对象以及交点位置都求出来,保存到osgUtil:: LineSegmentIntersector:: Intersections中,可以参考osgpick例子

该用户从未签到

发表于 2008-3-22 00:01:36 | 显示全部楼层
有一点值得注意,光栅化后二维平面上的点不能反演找到真实的3D坐标,因为有一维已经丢失了,必须有一定的假设才行,比如array指定的y=z平面。

该用户从未签到

 楼主| 发表于 2008-3-25 17:56:07 | 显示全部楼层
谢谢楼上

该用户从未签到

发表于 2012-10-24 19:37:30 | 显示全部楼层
本帖最后由 mxl12315 于 2012-10-24 21:37 编辑
array 发表于 2008-3-21 10:52
屏幕上的某个点要转换到三维空间,在OpenGL中往往使用glUnProject函数;而在OSG中可以使用osgManipulat ...


锐哥,我最近也在做二维坐标到三维坐标的转换内容,看了您这个帖子,遂仿照了下,但还是出现问题。
  我的程序大体是鼠标双击地面确定一个起点,双击空中又形成一个点,之后成线。代码中有两方面的判断:
2.jpg


但是,当我点击位于地面上的点任意一个高度时,本应该在其上方形成一个点的。。。可是结果却是跑到屏幕面前,自己电脑前忽然出现一个点,如图:
(1) 1.jpg

(2) 1.jpg

我是按照您说的,通过那个osgManipulator:laneProjector做的,可喜的是我获得了画出了空间中的那个点,但是那个点貌似还不是世界坐标。。。求指点

该用户从未签到

发表于 2012-10-25 07:58:13 | 显示全部楼层
本帖最后由 liuzhiyu123 于 2012-10-25 07:58 编辑
  1. osgManipulator::PlaneProjector
复制代码
算出的是射线与这个平面的最近的交点,这就要看您的平面是在什么位置了

该用户从未签到

发表于 2012-10-25 09:34:11 | 显示全部楼层
呵呵,一个屏幕点,加2个深度,确定空间射线,加以物体就OK

该用户从未签到

发表于 2012-10-26 10:41:59 | 显示全部楼层
本帖最后由 wanggang8826 于 2012-10-26 10:43 编辑
mxl12315 发表于 2012-10-24 19:37
锐哥,我最近也在做二维坐标到三维坐标的转换内容,看了您这个帖子,遂仿照了下,但还是出现问题。
   ...


你的程序里面的x和y是不是窗口坐标啊,是不是应该先求出来屏幕坐标(x,y)对应的远、近裁剪面的世界坐标nearPoint、farPoint,然后再pi.setNearFarPoint( nearPoint, farPoint );而不是直接使用pi.setNearFarPoints( osg::Vec3(x,-10000,y), osg::Vec3(x,10000,y) );
我猜测。

该用户从未签到

发表于 2012-10-26 12:05:33 | 显示全部楼层
array 发表于 2008-3-21 12:56
有一个很好用的函数:
osgViewer::View:: computeIntersections
给定X,Y值,然后OSG会自动把所有存在交点 ...

昨天研究了半天,发现intersection里面node节点和drawable节点貌似不是存在一起的,不知道这是为啥

该用户从未签到

发表于 2012-10-29 10:09:02 | 显示全部楼层
因为drawable不是节点。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表