[osg-users] Realtime Pointpicking

Robert Osfield robert.osfield at gmail.com
Fri Jun 24 11:39:00 PDT 2016


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 <daniel.rd at hotmail.de> 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
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



More information about the osg-users mailing list