查看: 4173|回复: 7

屏幕坐标向世界坐标转换的问题

[复制链接]

该用户从未签到

发表于 2008-6-17 11:06:08 | 显示全部楼层 |阅读模式
使用如下代码实现了屏幕坐标向世界坐标的转换

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

两种方法得到坐标是相同的。

但发现个问题,不知如何解决,我在viewer中绘制了一个物体,但这个物体只占了场景中间的部分区域,而计算时,却计算整个viewer的坐标,我想只计算物体的坐标,而场景的背景不需要计算,请教高手如何实现!

另外,发现计算坐标时,得到的坐标不正确,即计算出的坐标与实际绘制的坐标不匹配,不知什么原因。

[ 本帖最后由 vruser 于 2008-6-17 14:17 编辑 ]

该用户从未签到

发表于 2008-6-17 21:29:44 | 显示全部楼层
看了一下源代码,发现computeWindowMatrix()这个函数在计算的时候没有考虑到视口的原点坐标导致计算有问题,一个BUG~~~~~~~

该用户从未签到

 楼主| 发表于 2008-6-17 22:00:42 | 显示全部楼层
那如何解决呢,有没有其它的方法计算出正确的世界坐标?

该用户从未签到

 楼主| 发表于 2008-6-17 22:28:03 | 显示全部楼层
另外,在osg中是否有这样的函数,可以得到深度缓冲的z值,类似于opengl中的 glReadPixels( x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z );

该用户从未签到

发表于 2008-6-17 23:16:01 | 显示全部楼层


可以试着自己写一个函数,注意考虑视口的原点坐标,参考它的写法~~~~~如果全屏下的话,应该不会有什么问题的吧~~~~~~~~~


该用户从未签到

 楼主| 发表于 2008-6-18 00:32:08 | 显示全部楼层
请讲一下思路,源代码如下

inline const osg::Matrix computeWindowMatrix() const
        {
            return osg::Matrix::translate(1.0,1.0,1.0)*osg::Matrix::scale(0.5*width(),0.5*height(),0.5f)*osg::Matrix::translate(x(),y(),0.0f);
        }

如何修改?

该用户从未签到

发表于 2008-6-18 12:25:20 | 显示全部楼层
不好意思,昨天我发现我看的是老的源代码 :L :L ~现在新的都修正了,不过还是有问题的~~~

参考这个吧~~~~
http://bbs.osgchina.org/viewthread.php?tid=370&extra=page%3D1

该用户从未签到

 楼主| 发表于 2008-6-18 14:35:18 | 显示全部楼层
使用例子pick实现了,即实现 handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa),得到世界坐标系的点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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