屏幕-------->世界
可以使用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;
世界------>屏幕
就是上面的矩阵不要求逆即可!