查看: 1095|回复: 0

利用PlaneIntersector裁剪实现圆环

[复制链接]

该用户从未签到

发表于 2014-9-29 15:18:02 | 显示全部楼层 |阅读模式
本帖最后由 rubby 于 2014-9-29 15:20 编辑

又向各位大牛请教一下:

我创建了两个圆柱面,半径不同,然后利用PlaneIntersector裁剪,是否可以将这两个圆柱面中间的圆环显示出来?
代码如下。现在的结果是: 此圆所在的面获取了,但是圆环没有,见附图,请各位赐教。 或者有别的方法实现吗吗??
比如:将两个面都截取出来,然后通过求两个面的差集,osg貌似没有这种功能。
小弟实在想不出方法。跪谢。

  1. int main( int argc, char** argv ){
  2.         //1. 创建两个圆柱面
  3.         float height = 5.f;
  4.         osg::ref_ptr<osg::TessellationHints> hints;
  5.         hints = new osg::TessellationHints;       
  6.         hints->setDetailRatio(0.5f);// 控制精细度
  7.         hints->setCreateBody(true);
  8.         //hints->setCreateBackFace(true);
  9.         hints->setCreateBottom(false);
  10.         hints->setCreateTop(false);
  11.         osg::ref_ptr<osg::Geode> mynode = new osg::Geode;
  12.         osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(0.0f,0.0f,0.0f),1.0f,height),hints);
  13.         osg::ref_ptr<osg::ShapeDrawable> drawable2 = new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(0.0f,0.0f,0.0f),4.0f,height),hints);;
  14.        
  15.         mynode->addDrawable(drawable.get());       
  16.         mynode->addDrawable(drawable2.get());
  17.        
  18.         osg::ref_ptr<osg::Group> root = new osg::Group;
  19.         root->addChild(mynode.get() );


  20.         //2 PlaneIntersector 实现
  21.         osg::Plane plane( osg::Vec3(0,0,1), osg::Vec3(0,0,0) ); //(norm point)        The normal of the plane. point        A point of the plane.
  22.         osg::Polytope polytope;
  23.         /*polytope.add( osg::Plane(osg::Vec3(1,0,0), osg::Vec3(-1,0,0)) );
  24.         polytope.add( osg::Plane(osg::Vec3(-1,0,0), osg::Vec3(1,0,0)) );*/
  25.         osg::ref_ptr<osgUtil::PlaneIntersector> intersector = new osgUtil::PlaneIntersector( plane, polytope );

  26.         osgUtil::IntersectionVisitor iv( intersector.get() );
  27.         mynode->accept( iv );

  28.         if ( intersector->containsIntersections() )
  29.         {
  30.                 osgUtil::PlaneIntersector::Intersections
  31.                         &intersections = intersector->getIntersections();
  32.                 std::cout <<"intersection size "<<intersections.size()<<std::endl;

  33.                 osg::Geode * geode=new osg::Geode;
  34.                 osg::Geometry * geom=new osg::Geometry;
  35.                 osg::Vec3Array* v3a=new osg::Vec3Array;
  36.                 osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
  37.                 colors->push_back( osg::Vec4(1.0, 0.0, 0.0, 1.0) );

  38.                 osgUtil::PlaneIntersector::Intersections::iterator itr;
  39.                 for ( itr = intersections.begin(); itr != intersections.end(); ++itr )
  40.                 {
  41.                         for ( unsigned int i=0; i<(*itr).polyline.size(); ++i )
  42.                                 std::cout <<" X" << (*itr).polyline[i].x()
  43.                                 << " Y" << (*itr).polyline[i].y()
  44.                                 << " Z" <<(*itr).polyline[i].z() << std::endl;

  45.                         //交点坐标
  46.                         std::vector<osg::Vec3d> intersectPoints = itr->polyline;
  47.                         std::cout<<        intersectPoints.size()<<std::endl;
  48.                        
  49.                         for (unsigned int i=0;i<intersectPoints.size();i++)
  50.                         {
  51.                                 v3a->push_back(intersectPoints.at(i));
  52.                                
  53.                         }       
  54.                 }

  55.                 geom->setVertexArray(v3a);
  56.                 geom->setColorArray(colors.get() );
  57.                 geom->setColorBinding(osg::Geometry::BIND_OVERALL);
  58.                 geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON,0,v3a->size()));
  59.                 //geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP,0,v3a->size()));
  60.                 geode->addDrawable(geom);
  61.                 osg::BoundingSphere bs=geode->getBound();
  62.                 std::cout<<"radius"<<bs.radius()<<std::endl;
  63.                 root->addChild(geode);
  64.         }

  65.         osgViewer::Viewer viewer;
  66.         viewer.setSceneData(root.get());
  67.         viewer.addEventHandler(new osgViewer::WindowSizeHandler);
  68.         return viewer.run();

  69. }
复制代码
圆环呢.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表