OSG中屏幕坐标和世界坐标的转化

时间:2021-05-25 09:44:41

屏幕-------->世界

可以使用osgUtil::SceneView::ProjectWindowIntoObject()来计算

bool SceneView::projectWindowIntoObject(const osg::Vec3& window,osg::Vec3& object) const
{
osg::Matrix inverseMVPW;
inverseMVPW.invert(computeMVPW());

object = window*inverseMVPW;

return true;
}
const osg::Matrix SceneView::computeMVPW() const
{
osg::Matrix matrix( getViewMatrix() * getProjectionMatrix());

if (getViewport())
matrix.postMult(getViewport()->computeWindowMatrix());
else
OSG_WARN<<"osg::Matrix SceneView::computeMVPW() - error no viewport attached to SceneView, coords will be computed inccorectly."<<std::endl;

return matrix;
}


或者自己运算

Matrix VPW = camera->getViewMatrix() *
camera->getProjectionMatrix() *
camera->getViewport()->computeWindowMatrix();
Matrix inverseVPW = Matrix::inverse(VPW);
Vec3d world = window * inverseVPW;

世界------>屏幕

就是上面的矩阵不要求逆即可!