[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