I hacked the Quick Start Guide example to draw two large quads instead of
two cows and you're absolutely right! One of the quad vertices has to be
inside the polytope in order for picking to work. This seems like a bug in
the Intersector classes. Either submit a fix, or alert Robert to this when
he's back from vacation.
   -Paul
 


  _____  

From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of alessandro
terenzi
Sent: Wednesday, April 18, 2007 2:30 AM
To: osg users
Subject: Re: [osg-users] mouse picking problem


I cleaned up my code and here a simple example showing my problem:
...here's the handle method:
 
bool myEventHandler::handle( const osgGA::GUIEventAdapter& ea,
osgGA::GUIActionAdapter& aa )
{
   osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>( &aa ); 
   if (!viewer)
      return false;
   
   switch( ea.getEventType() )
   {
      case osgGA::GUIEventAdapter::PUSH:
      case osgGA::GUIEventAdapter::MOVE: 
      {
         _mX = ea.getX();
         _mY = ea.getY();
         return false;
      }
      case osgGA::GUIEventAdapter::RELEASE:
      {
         if (_mX == ea.getX() && _mY == ea.getY ())
         {
            if (pick( ea.getXnormalized(),ea.getYnormalized(), viewer ))
               return true;
         }
         return false;
      }
      default:
         return false;
   }
}

...and here's the pick method:

bool myEventHandler::pick( const double x, const double y,
osgViewer::Viewer* viewer )
{
   if (!viewer->getSceneData())
      // Nothing to pick.
      return false; 
  
   double w( .05 ), h( .05 );
   osgUtil::PolytopeIntersector* picker = new
osgUtil::PolytopeIntersector(osgUtil::Intersector::PROJECTION, x-w, y-h,
x+w, y+h );
   osgUtil::IntersectionVisitor iv(picker);
   
   viewer->getCamera()->accept(iv);
   if (picker->containsIntersections())
   {
      std::cout<< "Found intersections..."<<std::endl;
      osg::NodePath& nodePath = picker->getFirstIntersection().nodePath; 
      unsigned int idx = nodePath.size();
      while (idx--)
      {
         // look for osg::Geode object
         osg::Geode* my_geode = dynamic_cast<osg::Geode*>(nodePath[idx]);
         if(my_geode == NULL) 
            continue;
         
         std::cout<< "Picking successful..."<<std::endl;
         break;
      }
   }
   else
   {
      std::cout<<"Picking failed [no intersections]... "<<std::endl; 
      return false;
   }

   return true;
}

...and finally the main:

int main(int argc, char* argv[]) 

{
    osgViewer::Viewer viewer;

    osg::ref_ptr<osg::Node> scene = createPyramid(50.0f, 50.0f);

    viewer.addEventHandler(new myEventHandler);

    viewer.setSceneData(scene.get());

    return viewer.run();   
}

The behaviour I'm experiencing is as follow: after clicking far away from
the pyramid I got this output on the console:

Picking failed [no intersections]...

after clicking inside one of the pyramid's faces, I got:

Picking failed [no intersections]...

finally when I clicked on the apex, I got:

Found intersections...
Picking successful...

Any Idea about what is wrong?

Thanks.

Alessandro 

 

On 4/17/07, Paul Martz <[EMAIL PROTECTED]> wrote:

The Quick Start Guide example code is based on the osgkeyboardmouse example,
just a simplified version to demonstrate mouse-based picking. 

You might try creating a simple reproducer program that draws a single large
quad and fails to pick it when you click in the quad center. I'd like to see
that code.
  -Paul


> -----Original Message----- 
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of 
> Andreas Goebel
> Sent: Tuesday, April 17, 2007 1:14 PM
> To: osg users
> Subject: Re: [osg-users] mouse picking problem
>
> alessandro terenzi schrieb:
> > I'm implementig mouse picking into my application...I used 
> the code of
> > the Quick Start Guide as a reference but, instead of looking for
> > osg::MatrixTransform node, I look for my osg::Group derived
> > objects...my problem is that picking seems to work just 
> when I click
> > close to vertices but it doesn't work if I click in the middle of a
> > polygon defined by those same vertices. I thought that the various
> > intersectors checked for any intersection against a bounding 
> > volume...any suggestion?
> >
> > Thanks.
> > Alessandro
> Hi,
>
> I haven“t read the Quick-Start-Guide, but in case you modify
> the vertices in your geometry you have to call dirtyBound() 
> after that to force recomputing the boundingBox after the
> next traversal.
>
> This will give you the right picks.
>
> Regards,
>
> Andreas
>
> _______________________________________________ 
> osg-users mailing list
> [email protected]
> http://openscenegraph.net/mailman/listinfo/osg-users
<http://openscenegraph.net/mailman/listinfo/osg-users> 
> http://www.openscenegraph.org/

_______________________________________________
osg-users mailing list
[email protected]  <mailto:[email protected]> 
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/



_______________________________________________
osg-users mailing list
[email protected]
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/

Reply via email to