查看: 11054|回复: 5

使用osg如何实现屏幕坐标向世界坐标转换

[复制链接]

该用户从未签到

发表于 2008-6-10 16:06:46 | 显示全部楼层 |阅读模式
在OpenGL中可使用 gluUnProject 实现屏幕坐标向世界坐标的转换,在osg中如何实现?

另如何在osg中实现与场景的交互,即实现在场景中拣选物体?

该用户从未签到

发表于 2008-6-10 20:23:57 | 显示全部楼层
屏幕-〉世界:
osgUtil::SceneView::projectWindowIntoObject
或者自己运算
Matrix VPW = camera-〉getViewMatrix() *
                      camera-〉getProjectionMatrix() *
                      camera-〉getViewport()-〉computeWindowMatrix();
Matrix inverseVPW;
inverseVPW.invert(VPW);
Vec3d world = window * inverseVPW;

世界-〉屏幕:
osgUtil::SceneView::projectObjectIntoWindow
或者自己运算
Matrix VPW = camera-〉getViewMatrix() *
                      camera-〉getProjectionMatrix() *
                      camera-〉getViewport()-〉computeWindowMatrix();
Vec3 window = world * VPW;

至于场景交互与拣选的例子就数不胜数了,建议先阅读一下官方的osgpick例子,以及《OSG快速入门指导》(OSGQSG)的最后一章

该用户从未签到

发表于 2008-6-11 00:52:34 | 显示全部楼层
array说得对,,在OSG里面确实有可以直接使用的函数:
osgUtil::SceneView::projectObjectIntoWindow(const osg::Vec3 &  window, osg::Vec3 &  object)
osgUtil::SceneView::projectWindowIntoObject(const osg::Vec3 &  object, osg::Vec3 &  window)


不过,你拣选的话,可能会用到这个函数~~~computeIntersections(x,y,intersections),它也是可以实现的~~~~

该用户从未签到

 楼主| 发表于 2008-6-11 11:25:04 | 显示全部楼层
多谢!

该用户从未签到

发表于 2014-9-4 17:51:56 | 显示全部楼层
array 发表于 2008-6-10 20:23
屏幕-〉世界:
osgUtil::SceneView::projectWindowIntoObject
或者自己运算

Hi,锐哥。
我想问一个这个转换在应用的问题:

现在我截取场景的相邻两帧,计算第一帧每个像素点(x1, y1)在世界坐标系的位置,然后到了第二帧,获取第二帧时的VPW,然后根据第一帧的世界坐标反算出屏幕坐标(x2, y2),但是我发现即使在相邻俩帧有明显场景变换的情况下,计算出来的像素点相对第一帧偏移不明显(x1相对x2可能只是相差一两个像素点),我考虑到有可能是精度的问题,但是我已经把所有变量都设置成Vec3或Matrixd的精度了,获取矩阵也考虑了多线程的影响,已经保证获取的矩阵是在截图时的VPW,即保证是最新的矩阵

这有可能是什么其他问题吗?

该用户从未签到

发表于 2014-9-4 18:50:16 | 显示全部楼层
array 发表于 2008-6-10 20:23
屏幕-〉世界:
osgUtil::SceneView::projectWindowIntoObject
或者自己运算

已经关闭了自动计算远近平面了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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