查看: 2322|回复: 12

读取文件生成模型代码

[复制链接]

该用户从未签到

发表于 2009-4-16 11:24:25 | 显示全部楼层 |阅读模式
  1. osg::ref_ptr<osg::Geode> ReadData()
  2. {
  3.        
  4.     osg::ref_ptr<osg::Geometry> geom3=new osg::Geometry;
  5.         osg::ref_ptr<osg::Vec3Array> v=new osg::Vec3Array;
  6.         geom3->setVertexArray(v.get());
  7.         float x,y,z;

  8.         char buffer[256];
  9.         ifstream infile;
  10.         infile.open("sg.txt");


  11.         if(!infile)
  12.         {
  13.           cout << "Unable to open datafile";
  14.           exit(1); // terminate with error

  15.         }
  16.         int i=0;
  17.         while (!infile.eof() )
  18.           {
  19.                 infile.getline(buffer,256);
  20.                 sscanf(buffer,"%f %f %f",&x,&y,&z);
  21.                 cout<<x<<" "<<y<<" "<<z<<endl;
  22.                  v->push_back(osg::Vec3(x,y,z));
  23.                 i++;
  24.           }
  25.         infile.close();

  26.         osg::ref_ptr<osgUtil::DelaunayTriangulator> dt=new osgUtil::DelaunayTriangulator(v.get());
  27.         dt->triangulate();
  28.         geom3->addPrimitiveSet(dt->getTriangles());
  29.         geom3->setNormalArray(dt->getOutputNormalArray());
  30.         geom3->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);

  31.         osg::ref_ptr<osg::Geode> geode=new osg::Geode;
  32.         geode->addDrawable(geom3.get());

  33.         return geode.get();
  34. }
复制代码

程序截图

程序截图

该用户从未签到

 楼主| 发表于 2009-4-16 11:25:54 | 显示全部楼层
不过有个问题,生成模型为什么不能从各个角度看都是正常的颜色,就象那个茶壶,不知道是不是法线设置的问题,大家给个意见

该用户从未签到

发表于 2009-4-16 12:20:15 | 显示全部楼层
可以用SmoothingVisitor自动生成法线

该用户从未签到

 楼主| 发表于 2009-4-16 12:43:13 | 显示全部楼层
多谢array,加入这句就可以了
osgUtil::SmoothingVisitor::smooth(*geom3);

修正后的

修正后的

该用户从未签到

发表于 2009-4-16 12:58:12 | 显示全部楼层
这个是,人的后槽牙?

该用户从未签到

发表于 2009-4-16 15:10:29 | 显示全部楼层
呵呵,这问题我也遇到了,虽然重新生成的模型每个顶点的法线个原文件的相同但是,颜色上总有很大的偏差

该用户从未签到

发表于 2009-4-16 15:39:10 | 显示全部楼层
我加了osgUtil::SmoothingVisitor::smooth()后,颜色并没有变过来,反而变成全黑了,不知什么原因

该用户从未签到

 楼主| 发表于 2009-4-16 18:10:36 | 显示全部楼层
呵呵,array的想象力真丰富
如果现在想用线框来表示这个曲面,是不是可以设置这个节点的状态?

该用户从未签到

 楼主| 发表于 2009-4-16 18:22:15 | 显示全部楼层
假设还是正确的,在gemode节点加入下面几行即可:
  1.        
  2.          osg::StateSet* stateset = new osg::StateSet;
  3.         osg::PolygonMode* pm = new osg::PolygonMode;
  4.         pm->setMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
  5.         stateset->setAttributeAndModes(pm,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
  6.         osg::ref_ptr<osg::Geode> geode=new osg::Geode;
  7.         geode->setStateSet(stateset);
复制代码

线框模型

线框模型

该用户从未签到

 楼主| 发表于 2009-4-16 18:39:25 | 显示全部楼层
又想到一个问题,如何在这个面上画出等高线呢?

该用户从未签到

发表于 2009-4-16 21:55:53 | 显示全部楼层
等高线就只有自己计算了,没有直接的方法

该用户从未签到

 楼主| 发表于 2009-4-17 00:18:57 | 显示全部楼层
array,昨晚试了一下osgModeling里的布尔运算,跟我想像的结果不一样。
  1. osg::ref_ptr<osg::Node> createBoolean()
  2. {
  3.     osg::ref_ptr<osgModeling::Model> model1 = new osgModeling::Model(*createPlane());//建立一个平面
  4.     osg::ref_ptr<osgModeling::Model> model2 = new osgModeling::Model(*createFirstOperator());//建立一个正方体

  5.     // 进行求并布尔运算
  6.     osg::ref_ptr<osgModeling::BoolOperator> boolOp = new osgModeling::BoolOperator;
  7.         boolOp->setMethod( osgModeling::BoolOperator::BOOL_UNION);
  8.     boolOp->setOperands( model1.get(), model2.get() );

  9.     //输出结果
  10.     osg::ref_ptr<osg::Geometry> result = new osg::Geometry;
  11.     boolOp->output( result.get() );
  12.    
  13.     //整理
  14.     osgUtil::TriStripVisitor tsv;
  15.     tsv.stripify( *result );

  16.     osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  17.     geode->addDrawable( result.get() );
  18.     return geode.get();
  19. }
复制代码

求并

求并

求交

求交

该用户从未签到

发表于 2009-4-17 09:17:29 | 显示全部楼层
呃,有可能,这个布尔运算做得比较仓促。有时间我会仔细找原因的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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