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

Reply via email to