Hi here is my code,

Code:

                                        osg::BoundingSphere bs = 
mpHeightField->getBound();     //pView->getSceneData()->getBound();
                                        for (int i = 0; i <1; i ++)
                                        {
                                                osgUtil::IntersectionVisitor    
        _intersectionVisitor;

                                                osg::Plane plane;
                                                osg::Polytope boundingPolytope;

                                                float dfHeight = 
pGrid->getHeight(nR, nC);
                                           
                                   //     osg::Vec3d start = 
osg::Vec3d(bs._center.x()+ bs.radius(),0.0, dfHeight); 
                                  //      osg::Vec3d end =  
osg::Vec3d(bs._center.x()-bs.radius(), 0.0, dfHeight); 
                                                 osg::Vec3d start = 
osg::Vec3d(bs._center.x()+ bs.radius(),0.0, bs._center.z()+150); 
                                                 osg::Vec3d end =  
osg::Vec3d(bs._center.x()-bs.radius(), 0.0, bs._center.z()+150); 
                                                

                                                osg::Vec3d upVector (0.0, 1.0, 
0.0);
                                                
                                                // set up the main intersection 
plane
                                                osg::Vec3d planeNormal = (end - 
start) ^ upVector;
                                                planeNormal.normalize();        
                                                plane.set( planeNormal, start);

                                                // set up the start cut off 
plane
                                                osg::Vec3d startPlaneNormal = 
upVector ^ planeNormal;
                                                startPlaneNormal.normalize();
                                                boundingPolytope.add( 
osg::Plane(startPlaneNormal, start) );
                        
                                                // set up the end cut off plane
                                                osg::Vec3d endPlaneNormal = 
planeNormal ^ upVector;
                                                endPlaneNormal.normalize();
                                                boundingPolytope.add( 
osg::Plane(endPlaneNormal,end) );
                                                
                                                
osg::ref_ptr<osgUtil::PlaneIntersector> intersector = new 
osgUtil::PlaneIntersector(plane, boundingPolytope);

                                                
intersector->setRecordHeightsAsAttributes(true);
                                                
intersector->setEllipsoidModel(NULL);
                  
                                                _intersectionVisitor.reset();
                          //      
_intersectionVisitor.setTraversalMask(traversalMask);
                                                
_intersectionVisitor.setIntersector( intersector.get() );

                                                
pView->getSceneData()->accept(_intersectionVisitor);
                                           // 
mpHeightField->accept(_intersectionVisitor);
                                                
                                                //get intersection
                                                
osgUtil::PlaneIntersector::Intersections& intersections = 
intersector->getIntersections();

                                                typedef 
osgUtil::PlaneIntersector::Intersection::Polyline Polyline;
                                                typedef 
osgUtil::PlaneIntersector::Intersection::Attributes Attributes;

                                                if (!intersections.empty())
                                                {
                                                        
osgUtil::PlaneIntersector::Intersections::iterator itr;
                                                        for(itr = 
intersections.begin(); itr != intersections.end(); ++itr)
                                                        {
                                                                
osgUtil::PlaneIntersector::Intersection& intersection = *itr;
                                                         
                                                                if 
(intersection.matrix.valid())
                                                                {
                                                                        // 
osg::notify(osg::NOTICE)<<"  transforming "<<std::endl;
                                                                        // 
transform points on polyline 
                                                                        
for(Polyline::iterator pitr = intersection.polyline.begin(); pitr != 
intersection.polyline.end(); ++pitr)
                                                                        {
                                                                                
*pitr = (*pitr) * (*intersection.matrix);
                                                                        }
                                                                        // 
matrix no longer needed.
                                                                        
intersection.matrix = 0;
                                                                }
                                                        }
                                                        
                                                        
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
                                                        for(itr = 
intersections.begin(); itr != intersections.end(); ++itr)
                                                        {
                                                                 
osgUtil::PlaneIntersector::Intersection& intersection = *itr;
                                                                 osg::Geometry* 
geometry = new osg::Geometry;

                                                                 
osg::Vec3Array* vertices = new osg::Vec3Array;
                                                                 
vertices->reserve(intersection.polyline.size());
                                                                 
for(Polyline::iterator pitr = intersection.polyline.begin(); pitr != 
intersection.polyline.end(); ++pitr)
                                                                 {
                                                                         
vertices->push_back(*pitr);
                                                                 }
                                                                 
geometry->setVertexArray( vertices );
                                                                 
geometry->addPrimitiveSet( new osg::DrawArrays(GL_LINE_STRIP, 0, 
vertices->size()) );
                                
                                                                 
osg::Vec4Array* colours = new osg::Vec4Array;
                                                                 
colours->push_back( osg::Vec4(0.2f,0.2f,0.2f*i,1.0f) );

                                                                 
osg::LineWidth* linewidth = new osg::LineWidth();
                                                                 
linewidth->setWidth(4.0f);
                                                                 
geode->getOrCreateStateSet()->setAttributeAndModes(linewidth,osg::StateAttribute::ON);

                                                                 
geometry->setColorArray( colours );
                                                                 
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
                                                                 
geode->addDrawable( geometry );
                                                                 
geode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF );

                                                                
                                                        }

                                                         
osgDB::writeNodeFile(*geode, "raw.osg");
                                                        osg::Group* group = 
(osg::Group*)(pView->getSceneData());
                                                        group->addChild(geode);
                                                }
                                        }
 
 
 





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





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to