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

