[osg-users] Realtime Pointpicking

Julien Valentin julienvalentin51 at gmail.com
Wed Jun 29 06:30:10 PDT 2016


Hi Daniel,
A more complex and efficient way to achieve that would be to use Render2Texture approach:
-Add a Camera attached to a lower resolution osg::Image 
-render your point cloud using a vertex shader that use gl_VertexID to affect a custom color
-do your picking in the resulting image the color being the index the picked point 

But with this solution all your points should share the same PrimitiveSet (and so the same Geometry)


robertosfield wrote:
> Hi Daniel,
> 
> The PolytopeIntersector is the simplest route.  If you want to make
> things more efficient then you may well need to come up with a custom
> approach.
> 
> The LineSegmentIntersector is able to take advantage of KdTree graphs
> if they have been built for your scene graph and enables O(logn)
> intersections instead of O(n), but unfortunately PolytopeIntersector
> doesn't support KdTrees yet.  You are welcome to add it :-)
> 
> The other approach you could take is to break your dataset into
> smaller chunks, such as dividing it into an octree so that the
> internal nodes of the octree can be culled before only the bricks that
> intersect the Polytope need to be tested exhaustively.
> 
> Robert.
> 
> Robert.
> 
> On 24 June 2016 at 16:06, Daniel Neos <> wrote:
> 
> > Hi,
> > 
> > I have a Pickhandler and a dynamically changing scene which consists only of a geometry node. To be more specific, the geometry node represents a point cloud consisting over ~100000 vertices.
> > 
> > Using a line intersector makes it nearly impossible to get an intersection, but the Intersector I am using, the polytopeintersector, needs ~200ms to get an intersection, which is too long for my application. I need a 'smooth' visualization of ~20-25fps and this would be definitley a bottleneck.
> > 
> > Is there a more simple way to get intersections of a non-solid object fast?
> > 
> > Here is my PickHandler. Input arguments in my application are the normalized (x,y)coordinates from the GUIEventAdapter, buffer is the tolerance with 0.005 and the viewer casted from the ActionAdapter.
> > 
> > 
> > Code:
> > 
> > bool PickHandler::getPickedPoint(double x, double y, float buffer,
> > osgViewer::View* viewer)
> > {
> > osg::ref_ptr<osgUtil::PolytopeIntersector> intersector(0);
> > try
> > {
> > intersector = new osgUtil::PolytopeIntersector(
> > osgUtil::Intersector::PROJECTION,
> > x - buffer, y - buffer, x + buffer, y + buffer);
> > }
> > catch (const std::bad_alloc&)
> > {
> > return false;
> > }
> > 
> > // DimZero = check only for points
> > intersector->setDimensionMask(osgUtil::PolytopeIntersector::DimZero);
> > 
> > intersector->setIntersectionLimit(osgUtil::Intersector::LIMIT_NEAREST);
> > osgUtil::IntersectionVisitor iv(intersector);
> > viewer->getCamera()->accept(iv);
> > 
> > if (intersector->containsIntersections())
> > {
> > osgUtil::PolytopeIntersector::Intersection intersection
> > = *(intersector->getIntersections().begin());
> > 
> > const osg::Vec3f& p = intersection.intersectionPoints[0];
> > m_point.set(p[0], p[1], p[2]);
> > return true;
> > }
> > return false;
> > 
> > 
> > 
> > 
> > Thank you!
> > 
> > Cheers,
> > Daniel[/code]
> > 
> > ------------------
> > Read this topic online here:
> > http://forum.openscenegraph.org/viewtopic.php?p=67797#67797
> > 
> > 
> > 
> > 
> > 
> > _______________________________________________
> > osg-users mailing list
> > 
> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> > 
> _______________________________________________
> osg-users mailing list
> 
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> 
>  ------------------
> Post generated by Mail2Forum


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








More information about the osg-users mailing list