Thanks Frank.  I don't think I'm having the same problem.  I fail to
get an interestion hit of my HUD geometry when it's over the background.
I don't get 3-D geometry instead.  I get nothing.

I'm not sure if J-S's idea that something in changing between the
perspective and orthogonal cameras is the problem either.  I saw no
improvement running accept on the HUD camera first.  It seems we wouldn't
be changing in that case.

It looks like I need some quality debugging time.

-Don

Frank Miller wrote:
I had a problem in my application some time ago that sounds similar. I
have worked around the issue in a way not unlike Jean-Sébastien Guay.

If I remember correctly, the problem I was experiencing was due to the
fact that the intersections are sorted by depth without regard to
viewports. So even though the HUD geometry is rendered ontop of the
perspective geometry it could have a larger depth and thus ends up
further down the list. You can easily check if this is your issue by
printing all of the intersections.

Frank

On Wed, 2010-06-30 at 19:17 -0400, Don Leich wrote:

Hi J-S,

Thanks for your suggestion, but your workaround didn't work for me.
I've been running OSG 2.8.3 and also tried 2.9.7 with no improvement.

In my code _s_scene->getHUDCamera() returns the post render camera for
my HUD geometry.  I also have a pre render camera used for a background
image that I skip with a NodeMask.  If I disable the NodeMask the only
node I intersect with the perspective camera is my background image quad.

Could this be a clue, or is it just a side issue?

-Don

class Picking : public osg::Referenced
{
public:
    Picking() {}

    ~Picking() {}

    // Pick at the given mouse coordinates
    void pick( int mx, int my,
                        osgViewer::View* view, osg::Node *skipNode,
                        int &id, int &seed, float3 lcs, float3 wcs )
    {
        id = -1;
        seed = -1;
        lcs[0] = lcs[1] = lcs[2] = 0.;
        wcs[0] = wcs[1] = wcs[2] = 0.;

        osg::Drawable* drawable = 0;
        osg::Node* node = 0;
        osg::Group* parent = 0;

        osg::Viewport* viewport = view->getCamera()->getViewport();

        // Save and replace the node mask for a node to skip here,
        // typically the background image quad.
        osg::Node::NodeMask origNodeMask = skipNode->getNodeMask();
        skipNode->setNodeMask( 0x00000000 );

        bool gotPick = false;

        // Use PolytopeIntersector exclusively.  Works on all primitive types.
        if ( viewport != NULL )
        {
            osgUtil::PolytopeIntersector* picker;
            {
                // use window coordinates
                double fx = viewport->x() + mx;
double fy = viewport->y() + (viewport->height()-1) - my; // invert Y
                double ap = 2.;  // pick frustum aperture radius
                picker = new osgUtil::PolytopeIntersector(
                        osgUtil::Intersector::WINDOW, fx-ap, fy-ap, fx+ap, 
fy+ap );
            }
            osgUtil::IntersectionVisitor iv(picker);

            view->getCamera()->accept(iv);

//////////////////////////////////////////////////////////////////////////
// If we fail to find any intersections with the main camera, run the
// accept on the HUD camera.  This didn't help.  With a perspective main
// camera we never see the HUD geometry.
//////////////////////////////////////////////////////////////////////////

            if (! picker->containsIntersections())
                _s_scene->getHUDCamera()->accept(iv);

            if (picker->containsIntersections())
            {
                osgUtil::PolytopeIntersector::Intersection intersection =
                        picker->getFirstIntersection();

                // Removed application stuff here.

                // Local coordinate system point (really the average of all 
hits).
                osg::Vec3 lip;
                lip[0] = intersection.localIntersectionPoint[0];
                lip[1] = intersection.localIntersectionPoint[1];
                lip[2] = intersection.localIntersectionPoint[2];

                lcs[0] = lip[0];
                lcs[1] = lip[1];
                lcs[2] = lip[2];

// Transform local coordinate system point into world coordinate system point.
                osg::Vec3 wip = lip * (*intersection.matrix.get());
                wcs[0] = wip[0];
                wcs[1] = wip[1];
                wcs[2] = wip[2];

                drawable = intersection.drawable;

                gotPick = true;
            }
        }

        // Removed application stuff here.

        skipNode->setNodeMask( origNodeMask );  // restore
    }

    // Removed application stuff here.

};




Jean-Sébastien Guay wrote:

Hi Don,


I'm having a problem with not being able to pick on my HUD geometry when
the main camera has a perspective projection. My app is able to toggle
between
perspective and orthographic. Picking on the HUD geometry works fine with
orthographic, and the HUDs are visible in both projections.


This sounds a bit like the reason why in the example I sent a little while ago to test out the changed I had made to QWidgetImage, I had to customize the computeIntersections() method when my widget was under an ortho projection (i.e. displayed fullscreen). Unfortunately I didn't get to look into why that was, I just worked around it.

The workaround I used was to give the IntersectionVisitor directly to the ortho camera instead of starting it from the root (the viewer's main camera, which is the perspective one).

If I had to venture a guess I'd say it looks like some values are lingering around from the perspective projection once the IntersectionVisitor gets to the ortho camera, almost as if it hadn't seen that the ortho camera is in referenceFrame ABSOLUTE_RF (which means it should start over fresh, not multiply by the previous matrix). But as I said, I haven't dug any deeper, so that's just a hunch.

Hope this helps in some small way,

J-S

_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to