查看: 2296|回复: 5

通过mtxMVPW计算屏幕坐标时的问题

[复制链接]

该用户从未签到

发表于 2014-3-27 17:57:27 | 显示全部楼层 |阅读模式
通过世界坐标系下的坐标计算屏幕坐标系下的坐标时遇到一个问题。我的代码如下:

        osg::Matrix viewprojectMatrix = viewer->getCamera()->getViewMatrix();
        osg::Matrix projectMatrix= viewer->getCamera()->getProjectionMatrix();
        osg::Matrix mtxWindow = viewer->getCamera()->getViewport()->computeWindowMatrix();       
            osg::Matrix mtxMVPW = viewprojectMatrix * projectMatrix * mtxWindow;

        osg::Vec3f worldPoint=osg::Vec3f (-0.5,0.0,-0.5);
        osg::Vec4d screenPoint4d = osg::Vec4f(worldPoint, 1.0)*mtxMVPW;

通过view matrix, projection matrix和window matrix计算的mtxMVPW是一个4*4矩阵,而世界坐标系是三维的点,如何相乘得到屏幕坐标系呢?

如果把世界坐标系的点变成四维的,即(-0.5,0.0,-0.5,1.0),那么得到的屏幕坐标也是4维的,如何换算为2维屏幕坐标呢?还有一个疑问,屏幕坐标系指的是不是像素坐标呢?

我想通过世界坐标来计算osg中的像素坐标,但得到的结果和我截图获取的像素坐标值不一致,不知道这种算法是否正确呢?

希望知道的可以回答一下,提前多谢了!

该用户从未签到

发表于 2014-3-27 21:54:15 | 显示全部楼层
1. 向量和矩阵维数运算对齐的事,你就不必担心了,osg已经处理好了,可以直接这样运算 osg::vec3 = osg::vec3 * osg::Matix。
可以查看osg::Matix源码 乘法运算符的重载。

2. 如果 投影矩阵 vpw = ViewMatrix*ProjectionMatrix*WindowMatrix;

空间坐标osg::vec3 space在屏幕上的投影 osg::vec3 winp = osg::vec3 space*vpw;
winp.x(),winp.y()就是屏幕坐标,winp.z()肯定为0代表其深度值。

屏幕坐标x,y的空间坐标值 osg::vec3 space = osg::vec3(x,y,0)*osg::Matix::inverse(vpw);
视锥体近平面就是屏幕,远平面到近平面任意一条视线的深度归一化为1,
所以屏幕坐标x,y远平面上对应的空间坐标值 osg::vec3 farspace = osg::vec3(x,y,1)*osg::Matix::inverse(vpw);
你可以根据此公式计算视线上任意一点的空间坐标,深度为0的就是屏幕上对应的空间点。


3. 矩阵运算唯一需要注意的是 osg::Matix是行向量排列,而我们在书本上的姿态矩阵一般是列向量排列,
所以矩阵转置后,前乘后乘代表的绝对运动和相对运动的意义就变了 , 注意吧

不知道这样能说能说明白吗,代码不会像运算公式那样齐整,怎么用,要看其具体是怎么实现的!

该用户从未签到

 楼主| 发表于 2014-3-28 19:15:15 | 显示全部楼层
cenfer 发表于 2014-3-27 21:54
1. 向量和矩阵维数运算对齐的事,你就不必担心了,osg已经处理好了,可以直接这样运算 osg::vec3 = osg::v ...

非常感谢,我大概明白了。关于屏幕坐标和像素坐标还是有一点疑惑,请问这两个坐标系是一样的吗?区别是不是屏幕坐标是从左下角为0点,而像素坐标是左上方为0点呢?

该用户从未签到

发表于 2014-3-28 19:30:16 | 显示全部楼层
becky 发表于 2014-3-28 19:15
非常感谢,我大概明白了。关于屏幕坐标和像素坐标还是有一点疑惑,请问这两个坐标系是一样的吗?区别是不 ...

的确一般窗口坐标系原点在左上角,而OSG在左下角。
我觉得都是指窗口坐标系,叫法不同而已。
这些坐标都是逻辑坐标,真正的物理像素坐标也能算出来。
原点定哪,都是约定好的,知道就行,可能没有原因。

该用户从未签到

发表于 2014-3-28 21:22:31 | 显示全部楼层
cenfer 发表于 2014-3-27 21:54
1. 向量和矩阵维数运算对齐的事,你就不必担心了,osg已经处理好了,可以直接这样运算 osg::vec3 = osg::v ...

请问一下,你说的矩阵前乘和后乘代表的绝对运动和相对运动的几何意义是什么意思,不是太明白啊,可以详细给解释一下吗?

该用户从未签到

发表于 2014-3-28 22:08:10 | 显示全部楼层
蛋蛋 发表于 2014-3-28 21:22
请问一下,你说的矩阵前乘和后乘代表的绝对运动和相对运动的几何意义是什么意思,不是太明白啊,可以详细 ...

看看机器人学 吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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