/* OpenSceneGraph example, osgintersection. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include struct MyReadCallback : public osgUtil::IntersectionVisitor::ReadCallback { #if 0 virtual osg::Node* readNodeFile(const std::string& filename) { return osgDB::readRefNodeFile(filename).release(); } #endif virtual osg::ref_ptr readNodeFile(const std::string& filename) { return osgDB::readRefNodeFile(filename); } }; int main(int argc, char **argv) { // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments(&argc,argv); osg::ref_ptr scene = osgDB::readRefNodeFiles(arguments); if (!scene) { std::cout<<"No model loaded, please specify a valid model on the command line."<getBound(); bool useIntersectorGroup = true; bool useLineOfSight = true; //osg::CoordinateSystemNode* csn = dynamic_cast(scene.get()); //osg::EllipsoidModel* em = csn ? csn->getEllipsoidModel() : 0; if (useLineOfSight) { osg::Vec3d start = bs.center() + osg::Vec3d(0.0,bs.radius(),0.0); osg::Vec3d end = bs.center() - osg::Vec3d(0.0, bs.radius(),0.0); osg::Vec3d deltaRow( 0.0, 0.0, bs.radius()*0.01); osg::Vec3d deltaColumn( bs.radius()*0.01, 0.0, 0.0); osgSim::LineOfSight los; #if 1 unsigned int numRows = 20; unsigned int numColumns = 20; osgSim::HeightAboveTerrain hat; hat.setDatabaseCacheReadCallback(los.getDatabaseCacheReadCallback()); for(unsigned int r=0; rtick(); los.computeIntersections(scene.get()); osg::Timer_t endTick = osg::Timer::instance()->tick(); std::cout<<"Completed in "<delta_s(startTick,endTick)<tick(); std::cout<<"Computing HeightAboveTerrain"<tick(); for(unsigned int i=0; idelta_s(startTick,endTick)<tick(); std::cout<<"Computing ElevationSlice"<tick(); std::cout<<"Completed in "<delta_s(startTick,endTick)<first<<" "<second<tick(); osg::Vec3d start = bs.center() + osg::Vec3d(0.0,bs.radius(),0.0); osg::Vec3d end = bs.center();// - osg::Vec3d(0.0, bs.radius(),0.0); osg::Vec3d deltaRow( 0.0, 0.0, bs.radius()*0.01); osg::Vec3d deltaColumn( bs.radius()*0.01, 0.0, 0.0); unsigned int numRows = 20; unsigned int numColumns = 20; osg::ref_ptr intersectorGroup = new osgUtil::IntersectorGroup(); for(unsigned int r=0; r intersector = new osgUtil::LineSegmentIntersector(s, e); intersectorGroup->addIntersector( intersector.get() ); } } osgUtil::IntersectionVisitor intersectVisitor( intersectorGroup.get(), new MyReadCallback ); scene->accept(intersectVisitor); osg::Timer_t endTick = osg::Timer::instance()->tick(); std::cout<<"Completed in "<delta_s(startTick,endTick)<containsIntersections() ) { std::cout<<"Found intersections "<getIntersectors(); for(osgUtil::IntersectorGroup::Intersectors::iterator intersector_itr = intersectors.begin(); intersector_itr != intersectors.end(); ++intersector_itr) { osgUtil::LineSegmentIntersector* lsi = dynamic_cast(intersector_itr->get()); if (lsi) { osgUtil::LineSegmentIntersector::Intersections& intersections = lsi->getIntersections(); for(osgUtil::LineSegmentIntersector::Intersections::iterator itr = intersections.begin(); itr != intersections.end(); ++itr) { const osgUtil::LineSegmentIntersector::Intersection& intersection = *itr; std::cout<<" ratio "<tick(); #if 1 osg::Vec3d start = bs.center() + osg::Vec3d(0.0,bs.radius(),0.0); osg::Vec3d end = bs.center() - osg::Vec3d(0.0, bs.radius(),0.0); #else osg::Vec3d start = bs.center() + osg::Vec3d(0.0,0.0, bs.radius()); osg::Vec3d end = bs.center() - osg::Vec3d(0.0, 0.0, bs.radius()); #endif osg::ref_ptr intersector = new osgUtil::LineSegmentIntersector(start, end); osgUtil::IntersectionVisitor intersectVisitor( intersector.get(), new MyReadCallback ); scene->accept(intersectVisitor); osg::Timer_t endTick = osg::Timer::instance()->tick(); std::cout<<"Completed in "<delta_s(startTick,endTick)<containsIntersections() ) { osgUtil::LineSegmentIntersector::Intersections& intersections = intersector->getIntersections(); for(osgUtil::LineSegmentIntersector::Intersections::iterator itr = intersections.begin(); itr != intersections.end(); ++itr) { const osgUtil::LineSegmentIntersector::Intersection& intersection = *itr; std::cout<<" ratio "<