查看: 792|回复: 2

LineSegmentIntersector 存在bug?

[复制链接]

该用户从未签到

发表于 2014-10-5 16:27:22 | 显示全部楼层 |阅读模式
各位大哥,国庆节时候,发现LineSegmentIntersector 有问题:
代码如下: 程序运行后,本来应该有8条线,结果只有7条线,如附件中的图:

  1. int main( int argc, char** argv ){

  2.         float height = 5.f;

  3.         osg::ref_ptr<osg::TessellationHints> hints;
  4.         hints = new osg::TessellationHints;       
  5.         hints->setDetailRatio(0.5f);//TODO 控制精细度
  6.         hints->setCreateBody(true);
  7.         //hints->setCreateBackFace(true); //必须去除这句话,否则贴图闪烁。
  8.         hints->setCreateBottom(false);
  9.         hints->setCreateTop(false);
  10.         osg::ref_ptr<osg::Geode> mynode = new osg::Geode;
  11.         osg::ref_ptr<osg::ShapeDrawable> drawable = new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(0.0f,0.0f,0.0f),1.0f,height),hints);
  12.         osg::ref_ptr<osg::ShapeDrawable> drawable2 = new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(0.0f,0.0f,0.0f),4.0f,height),hints);


  13.         mynode->addDrawable(drawable.get());        // geom.get() or gemo. both are ok.
  14.         mynode->addDrawable(drawable2.get());



  15.         osg::ref_ptr<osg::Group> root = new osg::Group;
  16.         root->addChild(mynode.get() );


  17.         float angle = 0.0;
  18.         float angleDelta = 2.0f*osg::PI/8;       

  19.         for(int i=0; i<8;i++){  

  20.                 float c = cosf(angle);
  21.                 float s = sinf(angle);
  22.                 osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector( osg::Vec3(0.0f,0.0f,0.0f),  osg::Vec3(10.0f*c,10.0f*s,0.0f) );

  23.                 osgUtil::IntersectionVisitor iv( intersector.get() );
  24.                 mynode->accept( iv );

  25.                 if ( intersector->containsIntersections() )
  26.                 {
  27.                         osgUtil::LineSegmentIntersector::Intersections
  28.                                 &intersections = intersector->getIntersections();
  29.                         std::cout <<"intersection size "<<intersections.size()<<std::endl;

  30.                         osg::ref_ptr<osg::Geode>  geode=new osg::Geode;
  31.                         osg::ref_ptr<osg::Geometry> geom=new osg::Geometry;
  32.                         osg::ref_ptr<osg::Vec3Array> v3a=new osg::Vec3Array;
  33.                         osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
  34.                         colors->push_back( osg::Vec4(1.0, 0.0, 0.0, 1.0) );



  35.                         osgUtil::LineSegmentIntersector::Intersections::iterator itr;
  36.                         for ( itr = intersections.begin(); itr != intersections.end(); ++itr ) //起始点:有四个交点,前两个交点一样,后两个交点一样(因为为了封闭)。其余点正常。
  37.                         {
  38.                                 std::cout <<" X" << itr->getWorldIntersectPoint().x()
  39.                                         << " Y" <<  itr->getWorldIntersectPoint().y()
  40.                                         << " Z" << itr->getWorldIntersectPoint().z();
  41.                                 if(itr == intersections.begin())
  42.                                         v3a->push_back( itr->getWorldIntersectPoint());
  43.                                
  44.                         }
  45.                                 itr--;
  46.                                 v3a->push_back( itr->getWorldIntersectPoint());
  47.                         std::cout<<std::endl;
  48.                         geom->setVertexArray(v3a);
  49.                         geom->setColorArray(colors.get() );
  50.                         geom->setColorBinding(osg::Geometry::BIND_OVERALL);
  51.                         for(int k=0; k<v3a->size(); k++){
  52.                                 std::cout<<"vectex: "<<v3a->at(k).x()<<" "<<v3a->at(k).y()<<" "<<v3a->at(k).z();
  53.                         }
  54.                         std::cout<<std::endl;
  55.                         geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,0,v3a->size()));
  56.                         geode->addDrawable(geom);
  57.                         root->addChild(geode);
  58.                 }else{
  59.                         std::cout<<"no intersection for i="<<i<<std::endl;
  60.                         std::cout<<"x "<<intersector->getStart().x()<<" y "<<intersector->getStart().y()<<" z "<<intersector->getStart().z()<<std::endl;
  61.                         std::cout<<"x "<<intersector->getEnd().x()<<" y "<<intersector->getEnd().y()<<" z "<<intersector->getEnd().z()<<std::endl;
  62.                 }
  63.                 angle+=angleDelta;
  64.         }
  65.         osgViewer::Viewer viewer;
  66.         viewer.setSceneData(root.get());
  67.         viewer.addEventHandler(new osgViewer::WindowSizeHandler);
  68.         return viewer.run();

  69. }
复制代码
Lines.png

该用户从未签到

 楼主| 发表于 2014-10-5 16:29:15 | 显示全部楼层
此外,osg:rimitiveSet:INES绘制出来的线,弯弯曲曲,有方法设置,使之平滑吗?

多谢各位神仙大哥。

该用户从未签到

 楼主| 发表于 2014-10-7 15:10:27 | 显示全部楼层
自己来结贴:
同样遇到此问题的兄弟可以如下解决:

intersector->setPrecisionHint(osgUtil::Intersector:recisionHint::USE_DOUBLE_CALCULATIONS);

注意:osg3.0.1 无此函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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