查看: 1119|回复: 5

关于反向投影

[复制链接]

该用户从未签到

发表于 2010-8-5 16:49:13 | 显示全部楼层 |阅读模式
当前投影矩阵为mtxProj,模型视图矩阵为mtxView,视口矩阵为mtxWindow,那么:
osg::Matrix  mtxVPW = mtxView * mtxProj * mtxWindow;
osg::Matrix mtxInverseVPW = osg::Matrix::inverse(mtxVPW);

屏幕上的一个点,像素坐标假设为(0, 0),显然这个点是角点:
osg::Vec3 p1(0, 0, 0);
p1 = p1 * mtxInverseVPW;

osg::Vec3 p2(0, 0, 1);
p2 = p2 * mtxInverseVPW;

上面这代码,是我试图计算屏幕角点的坐标,对应到三维世界坐标的最近点和最远点。
结果大失所望,得到的p1和p2,它们的z值是同一个值,显然是错误的。
我上面的思路有没有错误?

已知当前投影矩阵是正交矩阵。

该用户从未签到

 楼主| 发表于 2010-8-5 16:50:40 | 显示全部楼层
事实上,我这里取屏幕上的任何一个像素点(不一定要取角点),得到的结果都会这样,反向投影计算之后得到的z值都是相等的。真是奇怪。

莫非是正交投影下不存在Z值的概念?

该用户从未签到

发表于 2010-8-6 00:03:55 | 显示全部楼层
直接从屏幕投影到三维空间坐标似乎不大可能,,这个是需要制定深度才可以的

该用户从未签到

 楼主| 发表于 2010-8-6 09:35:31 | 显示全部楼层
指定的深度,我记得通常就是0.0到1.0之间的值啊!0.0表示在近剪裁面上的点,1.0表示在远剪裁面上的点。

该用户从未签到

发表于 2010-8-6 10:14:36 | 显示全部楼层
我觉得通过像素在屏幕上的位置最终得到空间位置是可行的。我不大理解您的mtxWindow事做什么用的。还有,如果你得projection matrix 是osg::Matrix:rtho2D的话,near  far  应该是-1.0 和 1.0吧。

该用户从未签到

发表于 2010-8-6 11:34:31 | 显示全部楼层
“通过像素在屏幕上的位置最终得到空间位置”,这的确是可行的,您的代码似乎也没有太大的问题,我不知道是否是某个矩阵的值不正确所致
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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