|
发表于 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 |
|