Thansk for pointing me to these topics.
So, I found the solution : (be carefull, these function use WORLD coordinates,
not local coordinates)
worldToScreen :
Code:
osg::Vec2d worldToScreen(const osg::Vec3d& worldPosition, const osg::Camera*
pCamera)
{
osg::Vec2d screenPosition;
if (pCamera!= NULL)
{
osg::Matrixd MVPW = pCamera->getViewMatrix() *
pCamera->getProjectionMatrix() * pCamera->getViewport()->computeWindowMatrix();
osg::Vec4d screenPosition4d = osg::Vec4d(worldPosition, 1.0) * MVPW;
screenPosition4d = screenPosition4d / screenPosition4d.w();
screenPosition4d.y() = pCamera->getViewport()->height() -
screenPosition4d.y();
screenPosition.set(screenPosition4d.x(), screenPosition4d.y());
}
return screenPosition;
}
screenToWorld :
Code:
osg::Vec3d screenToWorld(const osg::Vec2d& screenPosition, const osg::Camera*
pCamera)
{
osg::Vec3d worldPosition;
if (pCamera!= NULL)
{
osg::Vec4 screenPositionNear(screenPosition.x(),
pCamera->getViewport()->height() - screenPosition.y(), 0.0, 1.0);
osg::Vec4 screenPositionFar(screenPosition.x(),
pCamera->getViewport()->height() - screenPosition.y(), 1.0, 1.0);
osg::Matrixd iMVPW =
osg::Matrixd::inverse(pCamera->getViewMatrix() * pCamera->getProjectionMatrix()
* pCamera->getViewport()->computeWindowMatrix());
osg::Vec4 worldPositionNear = screenPositionNear * iMVPW;
osg::Vec4 worldPositionFar = screenPositionFar * iMVPW;
worldPositionNear = worldPositionNear / worldPositionNear.w();
worldPositionFar = worldPositionFar / worldPositionFar.w();
worldPosition.set((worldPositionNear.x() + worldPositionFar.x())/2.0,
(worldPositionNear.y() + worldPositionFar.y())/2.0, (worldPositionNear.z() +
worldPositionFar.z())/2.0);
}
return worldPosition;
}
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=43039#43039
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org