[osg-users] Converting model to screen coordinates (UNCLASSIFIED)
Buckley, Bob CTR MDA/IC
bob.buckley.ctr at mda.mil
Wed Jul 9 14:10:21 PDT 2008
Classification: UNCLASSIFIED
Caveats: NONE
I've done this in a couple different systems via a Cull callback.
Down thru the first 2 outputs, the math is correct, which was the
question.
However, I need to unproject, which breaks.
This allows me offsets in screen space, yet permits world space
callbacks, which I need.
Can someone point out why my unproject is inaccurate?
I suspect I'm missing something simple.
(disclaimer on typos as I had to type it into the email)
bool myCullCallback::cull(NodeVisitor *nodeVisitor, Drawable *drawable,
RenderInfo *renderInfo) const {
Camera *camera = renderInfo->getView()->getCamera();
Matrixd modelViewMtx = *((CullVisitor *)
nodeVisitor)->getModelViewMatrix(),
projectionMtx = camera->getProjectionMatrix(),
viewPortMtx = camera->getViewport()->computeWindowMatrix();
Vec3d modelPosition = modelViewMtx->getTrans();
cout << modelPosition[0] << " " << modelPosition[1] << " " <<
modelPosition[2] << endl;
Matrixd mtx(modelViewMtx * projectionMtx * viewPortMtx);
Vec3 v = Vec3() * mtx;
cout << v[0] << " " << v[1] << " " << v[2] << endl;
Matrixd iMtx;
iMtx.invert(mtx);
v = v * iMtx;
cout << v[0] << " " << v[1] << " " << v[2] << endl << endl;
return false;
}
I get this test output:
-1160.6 25013.1 -1.4e6
838.6 553.98 0.999331
16.2 -0.34 -0.334
Thanks
Bob Buckley
-----Original Message-----
From: osg-users-bounces at lists.openscenegraph.org
[mailto:osg-users-bounces at lists.openscenegraph.org] On Behalf Of Per
Rosengren
Sent: Thursday, July 03, 2008 1:32 AM
To: OpenSceneGraph Users
Subject: Re: [osg-users] Converting model to screen coordinates
I use an IntersectionVisitor with a customized Intersector.
The intersect function of the Intersector is called with the
IntersectionVisitor as argument. The IntersectionVisitor has all the
matrices I need:
I call this function from the intersect function:
/** compute the matrix that takes this Intersector from its
* CoordinateFrame into the local MODEL coordinate frame
* that geometry in the scene graph will always be in.
*/
void EdgeFinderProjectFind::locateCamera( osgUtil::IntersectionVisitor
&iv,
osg::Geometry* geometry )
{
_modelToWindowMatrix.identity();
if (iv.getWindowMatrix())
_modelToWindowMatrix.preMult( *iv.getWindowMatrix() );
if (iv.getProjectionMatrix())
_modelToWindowMatrix.preMult( *iv.getProjectionMatrix() );
if (iv.getViewMatrix())
_modelToWindowMatrix.preMult( *iv.getViewMatrix() );
if (iv.getModelMatrix())
_modelToWindowMatrix.preMult( *iv.getModelMatrix() ); }
Later I use this to get the window coordinates:
pWindow0 = p0 * _modelToWindowMatrix;
Per Rosengren
Helbig, Yuen wrote:
> Hello,
>
> I'm trying to convert from model coordinates to screen coordinates
> with the following code:
>
> // Compute the model to screen transformation matrix
> osgUtil::SceneView* sv = m_sHandler->getSceneView(); osg::Matrix
> modelView = sv->getViewMatrix(); osg::Matrix projection =
> sv->getProjectionMatrix(); osg::Matrix window =
> sv->getViewport()->computeWindowMatrix();
> osg::Matrix MVPW = modelView * projection * window;
>
> // convert a point in model coordinates to screen coordinates
> osg::Vec3 screenPoint = modelPoint * MVPW;
>
>
> The resulting screen coordinate point is correct in the x-dimension,
> but scaled down incorrectly in the y-dimension. The only point that
> is correct is the center point of the model.
>
> Am I missing a matrix somewhere? or does anyone have an alternate
> method of doing this?
>
>
> Yuen Helbig
>
>
>
>
>
> ----------------------------------------------------------------------
> --
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.
> org
Classification: UNCLASSIFIED
Caveats: NONE
More information about the osg-users
mailing list