查看: 3086|回复: 1

osgModeling的问题

[复制链接]

该用户从未签到

发表于 2009-4-29 11:29:05 | 显示全部楼层 |阅读模式
同一段代码,不同数据,代码不能正常运行,不提示错误,场景中什么都没有,单步调试也没出现问题,大家有兴趣可以调试调试。
第一组数据(可以得出正确结果,为棱台形状):
0.0 0.0 2.0
1.0 0.0 2.0
1.0 1.0 2.0
0.0 1.0 2.0
0.0 0.0 2.0
0.0 0.0 0.0
2.0 0.0 0.0
2.0 2.0 0.0
0.0 2.0 0.0
0.0 0.0 0.0
第二组数据:
0 0 0
2 2 0
4 0 0
6 -2 0
8 0 0
0 0 2
2 2 2
4 0 2
6 -2 2
8 0 2
  1.        
  2.      osg::ref_ptr<osg::Geode> geode=new osg::Geode;
  3.      //首先对数据进行分类,按照Z坐标形成各截面数据
  4.         vva.clear();
  5.         GroupByAxis();

  6.         std::vector<osg::Vec3Array*>::iterator iter=vva.begin();

  7.         osg::ref_ptr<osgModeling::Loft> loft=new osgModeling::Loft;
  8.         osg::ref_ptr<osgModeling::Curve> path=new osgModeling::Curve;
  9.         osg::ref_ptr<osgModeling::Curve> shape1;
  10.         osg::ref_ptr<osgModeling::Curve> shape2;


  11.         //for (int i=0;i<vva.size();i++)
  12.         //{
  13.                         //获得当前截面
  14.                         osg::Vec3Array* vag=*(iter+0);
  15.                         osg::Vec3Array* vagn=*(iter+1);

  16.                         //优化顶点方式选择
  17.                         osg::ref_ptr<osgUtil::DelaunayTriangulator> dt;
  18.                         osg::ref_ptr<osgUtil::DelaunayTriangulator> dtn;
  19.                         if (cmode!=0)
  20.                         {
  21.                                 dt=new osgUtil::DelaunayTriangulator(vag);
  22.                                 dt->triangulate();

  23.                                 dtn=new osgUtil::DelaunayTriangulator(vagn);
  24.                                 dtn->triangulate();
  25.                         }
  26.        
  27.                         shape1=new osgModeling::Curve;
  28.                         shape2=new osgModeling::Curve;
  29.                         if (cmode==2)
  30.                         {
  31.                                 Smooth* sm=new Smooth();               
  32.                                 shape1->setPath(sm->SmoothPolyLine(vag).get());
  33.                                 shape2->setPath(sm->SmoothPolyLine(vagn).get());

  34.                         }
  35.                         else
  36.                         {
  37.                                 shape1->setPath(vag);
  38.                                 shape2->setPath(vagn);
  39.                         }

  40.                         shape1->update();
  41.                         shape2->update();

  42.                         loft->addShape(shape1.get());
  43.                         loft->addShape(shape2.get());

  44.                         path->addPathPoint(vag->at(0));
  45.                         path->addPathPoint(vagn->at(0));                       
  46.         //}
  47.        
  48.         loft->setProfile(path.get());
  49.         loft->update();
  50.         geode->addDrawable(loft.get());

  51.         if (!geode)
  52.           return;

  53.         //优化模型
  54.         osgUtil::Optimizer optimizer;
  55.         optimizer.optimize(geode.get());
  56.         optimizer.reset();

  57.         //将模型加入场景中
  58.         DeleteAllChildren(mRoot);
  59.         mRoot->addChild(geode.get());
复制代码

该用户从未签到

 楼主| 发表于 2009-4-29 12:18:29 | 显示全部楼层
反复测试发现,将z坐标大的点首先加入loft中就可以得出正确结果,难道是因为path中顶点设置的次序有问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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