[osg-users] PlaneIntersector
Geoffroy Rivet-Sabourin
grsabourin at yahoo.ca
Tue Apr 19 19:53:14 PDT 2011
Hi,
I would like to compute a triangle Mesh slice. I create a scene that include only on node, my triangular mesh. I create a PlaneIntersector without clipping plane. The result is not empty ( if you test Intersection object for empty) but the sotfware crash immediately when I acces the Intersection object.
Code:
btBvhTriangleMeshShape Tmp ( m_mesh, true );
//m_Root->addChild ( osgbBullet::osgNodeFromBtCollisionShape( &Tmp ) );
osg::Node *nodeTmp = osgbBullet::osgNodeFromBtCollisionShape( &Tmp );
//nodeTmp->setNodeMask( 0x1 );
m_Root = new osg::Group;
m_Root->addChild ( nodeTmp );
osg::BoundingSphere bSphere;
bSphere = nodeTmp->getBound();
// set up the main intersection plane
osg::Plane intersectionPlane;
osg::Vec3d planeNormal ( m_planeNormal.x(), m_planeNormal.y(), m_planeNormal.z() );
osg::Vec3d planePoint ( m_planePoint.x(), m_planePoint.y(), m_planePoint.z() );
planeNormal.normalize();
intersectionPlane.set( planeNormal, planePoint );
osgUtil::IntersectionVisitor intersectionVisitor;
osg::ref_ptr<osgUtil::PlaneIntersector> intersector = new osgUtil::PlaneIntersector( intersectionPlane, boundingPolytope );
//osgUtil::PlaneIntersector *intersector = new osgUtil::PlaneIntersector( intersectionPlane );
std::vector<osg::Vec3d> intersectionPoints;
intersector->setRecordHeightsAsAttributes(true);
intersector->setEllipsoidModel(NULL);
intersectionVisitor.reset();
intersectionVisitor.setTraversalMask( 0x1 );
intersectionVisitor.setIntersector( intersector.get() );
m_Root->accept( intersectionVisitor );
osgUtil::PlaneIntersector::Intersections& intersections = intersector->getIntersections();
typedef osgUtil::PlaneIntersector::Intersection::Polyline Polyline;
typedef osgUtil::PlaneIntersector::Intersection::Attributes Attributes;
if (!intersections.empty())
{
// at this step size of intersection is 323361003. It is very big!!! ?
// It crash here
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,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, "c:\\out\\raw.osg");
}
Normally my plane intersect the mesh ( intersection is not empty). Where I can get exemple of PlaneIntersector. I have looked in OSG exemple but I never found an example.
Is some one have a solution
Thank you
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=38616#38616
More information about the osg-users
mailing list