查看: 3546|回复: 5

MVPW代表的是什么意义?

[复制链接]

该用户从未签到

发表于 2009-11-18 16:58:25 | 显示全部楼层 |阅读模式
本帖最后由 shypzms 于 2009-11-18 17:16 编辑

MVPW是个什么矩阵?应该怎样获得呢?

该用户从未签到

发表于 2010-8-15 12:36:05 | 显示全部楼层
在OSG的相机中,提供了快速获取模型视点矩阵、投影矩阵和窗口矩阵的方法。
模型视点矩阵:osg::Matrix mtxModelView = pCamera->getViewMatrix();
作用:将世界坐标系下的物体变换到相机坐标系中。
投影矩阵:osg::Matrix mtxProject = pCamera->getProjectionMatrix();
作用:将三维物体投影到二维平面上
窗口矩阵:osg::Matrix mtxWindow = pCamera->getViewport()->computeWindowMatrix();
作用:将二维平面上的物体,映射到窗口上,以便完成物体的绘制显示。

其中,mtxModelView * mtxProject 又称作为规格化矩阵,即范围在[-1, 1]之间。
提供上面的矩阵,我们可以轻松地完成从世界坐标点到平面坐标点,及从平面坐标点到世界坐标点的转换工作:
osg::Matrix mtxMVPW = mtxModelView * mtxProject * mtxWindow;
osg::matrix mtxInverseMVPW = osg::Matrix::Inverse(mtxMVPW);
osg::Vec3 vecWorldPt(0.0f, 0.0f, 0.0f);
osg::Vec3 vecWindowPt = vecWorldPt * mtxMVPW;

osg::Vec3 vecWindowPt(100.0f, 100.0f, 0.0f);
osg::Vec3 vecWorldPt = vecWindowPt * mtxInverseMVPW;


而对于PreMult和postMult,则可以理解为左乘和右乘。
osg::Matrix m;
osg::Matrix mtxResult;
mtxResult.PreMult(m);      即m * mtxResult
mtxResult.PostMult(m);    即mtxResult * m

该用户从未签到

发表于 2009-11-18 20:57:11 | 显示全部楼层
您大可以搜索一下,这个问题讨论过很多遍了。
MVPW不是OSG的概念,而是modelview * projection * window三个矩阵的级联,例如:
osg::Matrix mvp = camera->getViewMatrix() * camera->getProjectionMatrix(),这就是MVP矩阵,它是世界坐标到规格化坐标的变换矩阵,即v' = v * MVP,其中v'就是规格化空间([-1,1]之间)中的坐标,再乘以窗口矩阵(或者自己动手换算也可以),就是世界坐标转换到屏幕上的坐标

该用户从未签到

 楼主| 发表于 2009-11-19 09:13:22 | 显示全部楼层
  1. osg::Camera *camera = viewer.getCamera();
  2. _MVPW = camera->getViewMatrix() * camera->getProjectionMatrix();
  3. if (camera->getViewport())
  4.         _MVPW.postMult(camera->getViewport()->computeWindowMatrix());
复制代码
这样得到的是不是MVPW了呢,后面的_MVPW.postMult是否是得到的窗口矩阵?我是看到有别的例子中这样写的,不大清楚它的意义。

该用户从未签到

发表于 2009-11-19 21:37:17 | 显示全部楼层
是这样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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