[osg-users] Point Selection in Point Cloud

David Knipp David.Knipp at gmx.net
Mon Apr 4 06:12:49 PDT 2016


Hi Bruno,

You can choose many different ways. OSG is not a collision detection library but it has some functionality you can play with. Also you can use bullet physics which is a free physics library. Also this is a pretty easy detection implementation and you can just do it on your own.

1. osg:

look at: 
osg::PolytopyIntersector:


Code:

osgUtil::PolytopeIntersector * picker = new osgUtil::PolytopeIntersector(osgUtil::Intersector::CoordinateFrame::PROJECTION, rectangle_min_x, rectangle_min_y, rectangle_max_x, rectangle_maxy);

// setup picker ...
osgUtil::IntersectionVisitor intersecvisitor(picker);
// setup iv
viewer->getCamera()->accept(iv);




I'm not shure if it's possible to select a SINGLE Point from a geometry with this.

2. bullet physics

ask at bullet physics for this

3. own implementation:

an easy point in rectangle implementation:

Code:

bool point3DinsideRectangle2D(Position p, Rectangle r) {
   if(p.x < r.minPos.x || p.y < r.minPos.y)
       return false;
   if(p.x > r.maxPos.x || p.y > r.maxPos.y)
       return false;
   
}




If you would check every point like this it would take hours. So make this test above for each point after you checked the boundingbox of a geometry or drawable:


Code:

bool boundingBox3DinsideRectangle2D(BoundingBox bb, Rectangle r) {
   if(bb.xMin() < r.minPos.x || bb.yMin() < r.minPos.y)
       return false;
   if(bb.xMax() > r.maxPos.x || bb.yMax() > r.maxPos.y)
       return false;
   
}




You can implement this with a simple NodeVisitor. For the Rectangle make shure to transform the choosen min and max right.


Code:

   Rectangle r;
   
   // minP, maxP from selection
    // transform them
   minP = this->mViewer->getCamera()->getProjectionMatrix() * this->mViewer->getCamera()->getViewMatrix() * minP;
   maxP = this->mViewer->getCamera()->getProjectionMatrix() * this->mViewer->getCamera()->getViewMatrix() * maxP;
   // compute new min max
  r.min.x = min(minP.x, maxP.x);
  r.min.y = min(minP.y, maxP.y);
  r.max.x = max(minP.x, maxP.x);
  r.max.y = max(minP.y, maxP.y);




Something like this should work. But using a Rectangle isn't actually right. A rectangle drawn on display will actually create a frustum with the view. (If look at a cuboid in 3D, you will see a frustum that you'r brain will interpret as cuboid)

If you like to use frustum google for:
"Point in Frustum"
And
"Intersection BoundingBox and Frustum"

I guess you will find plenty of stuff.

Cheers,
NoxxKn

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








More information about the osg-users mailing list