Re: [osg-users] World to Screen Space

2011-12-08 Thread Martin Haffner
Hi,

Thanks, but your link does not help me that much. They are using the same code 
I use and still the code does not work;(

Cheers,
Martin

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=44286#44286





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] World to Screen Space

2011-12-08 Thread Sebastian Messerschmidt

Hello Martin,
there are some things I'd check:

1. Transformation order (i'm not quite sure about the osg::Matrix order)
So trymat * vec instead of vec* mat

2. viewMat, this should take you from object space to view-space if  I'm 
not mistaken.

So if you really have world-space you just need the view-transform here.

Basically I'd setup an simple example and check the matrices. Start with 
a simple translation etc.
As you don't state what exactly is wrong, I guess no one will be able to 
simply solve your problem.


cheers
Sebastian


Hi,

I want to transform a point from world space to screen space with this code:
Camera* cam = ...
Matrix viewMat = cam-getViewMatrix();
Matrix projMat = cam-getProjectionMatrix();
Viewport* vp   = cam-getViewport();
Matrix vpMat   = vp-computeWindowMatrix();  
Vec3 ls1SS = ls1WSPos * viewMat * projMat * vpMat;

Unfortunately the result vector ls1SS is not correct. Is my approach generelly 
right or did I miss something?

Thank you!

Cheers,
Martin

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=44277#44277





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] World to Screen Space

2011-12-08 Thread dimi christop
Hallo Martin,
After I saw your mail I put up a little example program which does what you 
want (i think).
Basically it prints the screen space coordinates of the center of the 3d 
sphere, which is in world space (0,0,0).
Use the normal osgViewer mouse controls to move the sphere model around.
Just copy the code and look at the print outs. I used a modified example from 
osghelp.com

Enjoy
Dimi



#include osgViewer/Viewer
#include osgGA/GUIEventHandler
#include osg/ShapeDrawable
#include osg/PositionAttitudeTransform
#include osg/LineSegment
#include osgUtil/IntersectVisitor
#includestdio.h

class CInputHandler : public osgGA::GUIEventHandler 
{
public:
    CInputHandler( osg::PositionAttitudeTransform* pPatSphere, osg::Node* 
pGraph )
    {
    m_rPatSphere    = pPatSphere;
    m_rGraph    = pGraph;
    }

    virtual bool handle( const osgGA::GUIEventAdapter ea, 
osgGA::GUIActionAdapter aa, osg::Object* pObject, osg::NodeVisitor* 
pNodeVisitor )
    {
    osgViewer::Viewer* pViewer = dynamic_castosgViewer::Viewer*(aa);
    if ( !pViewer )
    {
    return false;
    }
    
    // normalized mouse position
    float x = ea.getXnormalized();
    float y = ea.getYnormalized();

    osg::Matrixd proj = pViewer-getCamera()-getProjectionMatrix();

    osg::Viewport* viewport = pViewer-getCamera()-getViewport();
    double mx = viewport-x() + (int)((double 
)viewport-width()*(x*0.5+0.5));
    double my = viewport-y() + (int)((double 
)viewport-height()*(y*0.5+0.5));

    osg::Matrix MVPW = pViewer-getCamera()-getViewMatrix() * proj;
    MVPW.postMult( 
pViewer-getCamera()-getViewport()-computeWindowMatrix() );

    
    osg::Vec3 nearPoint = osg::Vec3(0.f,0.f,0.0f) * MVPW;
    printf(Screen Space: %f %f\n, nearPoint[0], nearPoint[1]);
    

    return false;
    }

private:
    osg::ref_ptrosg::PositionAttitudeTransform    m_rPatSphere;
    osg::ref_ptrosg::Node m_rGraph;
};

osg::Node* CreateScene( osgViewer::Viewer* pViewer )
{
    // create a group to contain our floor and sphere
    osg::Group* pGroup = new osg::Group;

    // create floor
    osg::Geode* pGeodeFloor = new osg::Geode;
    pGeodeFloor-addDrawable( new osg::ShapeDrawable( new 
osg::Box(osg::Vec3(0.0f,0.0f,-0.5f),100.0f, 100.0f, 1.0f) ) );
    pGroup-addChild( pGeodeFloor );

    // create sphere
    osg::Geode* pGeodeSphere = new osg::Geode;
    pGeodeSphere-addDrawable( new osg::ShapeDrawable( new 
osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),5.0f) ) );

    // create transform to move sphere
    osg::PositionAttitudeTransform* pPat = new osg::PositionAttitudeTransform;
    pPat-addChild( pGeodeSphere );
    pGroup-addChild( pPat );

    // add the handler to the viewer
    pViewer-addEventHandler( new CInputHandler(pPat, pGeodeFloor ) );

    return pGroup;
}

int main(int argc, char* argv[])
{
    // construct the viewer
    osg::ref_ptrosgViewer::Viewer rViewer = new osgViewer::Viewer;

    // make the viewer create a 512x512 window and position it at 32, 32
    rViewer-setUpViewInWindow( 32, 32, 512, 512 );

    // set the scene-graph data the viewer will render
    rViewer-setSceneData( CreateScene( rViewer.get() ) );

    // execute main loop
    return rViewer-run();
}







- Original Message -
From: Sebastian Messerschmidt sebastian.messerschm...@gmx.de
To: osg-users@lists.openscenegraph.org
Cc: Martin Haffner str...@gmx.net
Sent: Thursday, December 8, 2011 11:19 AM
Subject: Re: [osg-users] World to Screen Space

Hello Martin,
there are some things I'd check:

1. Transformation order (i'm not quite sure about the osg::Matrix order)
So try    mat * vec instead of vec* mat

2. viewMat, this should take you from object space to view-space if  I'm 
not mistaken.
So if you really have world-space you just need the view-transform here.

Basically I'd setup an simple example and check the matrices. Start with 
a simple translation etc.
As you don't state what exactly is wrong, I guess no one will be able to 
simply solve your problem.

cheers
Sebastian

 Hi,

 I want to transform a point from world space to screen space with this code:
 Camera* cam = ...
 Matrix viewMat = cam-getViewMatrix();
 Matrix projMat = cam-getProjectionMatrix();
 Viewport* vp   = cam-getViewport();
 Matrix vpMat   = vp-computeWindowMatrix();    
 Vec3 ls1SS = ls1WSPos * viewMat * projMat * vpMat;

 Unfortunately the result vector ls1SS is not correct. Is my approach 
 generelly right or did I miss something?

 Thank you!

 Cheers,
 Martin

 --
 Read this topic online here:
 http://forum.openscenegraph.org/viewtopic.php?p=44277#44277





 ___
 osg-users mailing list
 osg-users@lists.openscenegraph.org
 http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

___
osg-users mailing

[osg-users] World to Screen Space

2011-12-07 Thread Martin Haffner
Hi,

I want to transform a point from world space to screen space with this code:
Camera* cam = ...
Matrix viewMat = cam-getViewMatrix();
Matrix projMat = cam-getProjectionMatrix();
Viewport* vp   = cam-getViewport();
Matrix vpMat   = vp-computeWindowMatrix(); 
Vec3 ls1SS = ls1WSPos * viewMat * projMat * vpMat;

Unfortunately the result vector ls1SS is not correct. Is my approach generelly 
right or did I miss something?

Thank you!

Cheers,
Martin

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=44277#44277





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] World to Screen Space

2011-12-07 Thread Shayne Tueller
Hi,

This topic has been discussed in various forms. Please see

http://forum.openscenegraph.org/viewtopic.php?p=18256#18256

-Shayne

--
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=44280#44280





___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org