查看: 1963|回复: 6

如何得到正确地得到模型的三角面片(三角形)数据?与osgUtil::Optimizer有关系吗?

[复制链接]

该用户从未签到

发表于 2010-1-25 20:48:45 | 显示全部楼层 |阅读模式
程序如下:
struct GetVertex
{
    void operator() (const osg::Vec3& v1,const osg::Vec3& v2,const osg::Vec3& v3, bool) const
    {
        vertexList->push_back(v1);
        vertexList->push_back(v2);
        vertexList->push_back(v3);
    }
    osg::Vec3Array* vertexList;
   
};
void GetTriangles(osg:rawable& drawable,ofstream &fout)
{
  osg::TriangleFunctor<GetVertex> tf;
    tf.vertexList=new osg::Vec3Array;
    drawable.accept(tf);
int i=0;
    for(osg::Vec3Array::iterator itr=tf.vertexList->begin();
        itr!=tf.vertexList->end();
        itr++)
    {
        osg::Vec3 vertex=*itr;
  if(i==0)
  {
   fout<<"triangle{<"<<vertex.x()<<','<<vertex.z()<<','<<-vertex.y()<<">,<";
  }
  else if(i==1)
  {
   fout<<vertex.x()<<','<<vertex.z()<<','<<-vertex.y()<<">,<";
  }
  else if(i==2)
  {
   fout<<vertex.x()<<','<<vertex.z()<<','<<-vertex.y()<<">}"<<std::endl;
  }
  i++;
  if(i==3)i=0;
    }
}
class GetMeshVisitor : public osg::NodeVisitor
{
public:
GetMeshVisitor(char * f)sg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
{
  SceneSize = 0;
  filename=f;
  fout.open(filename,ofstream::out|ofstream::trunc);
  fout<<"union"<<endl;
  fout<<"{";
}
~GetMeshVisitor()
{
  fout<<"}"<<std::endl;
  fout.close();
}
int GetNumOfDrawable()
{
  return SceneSize;
}
virtual void apply(osg::Node& node)
{
  traverse(node);
}
void apply(osg::Geode& geode)
{
  for(unsigned int i=0; i<geode.getNumDrawables(); i++)
  {
   apply(geode.getDrawable(i));
  }
}
void apply(osg::Drawable* drawable)
{
  SceneSize++;
  GetTriangles(*drawable,fout);
}
protected:
int SceneSize;
public:
char * filename;
ofstream fout;
};
主函数:
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
osg::ref_ptr<osg::Group> root = new osg::Group();
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("Simple.osg");
root->addChild(node.get());

osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;

char * file="Simple.inc";
GetMeshVisitor gmv(file);
root->accept(cdv);
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
return 0 ;
}
问题:如果没有优化(去掉osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;),会有有些模型无法正确得到三角形数据,但是如果优化了(也就是加上那两行代码),就会有另外一些模型无法正确得到三角形数据,而原来的无法得到正确三角形数据的则可以得到正确结果。这是为什么?改怎么解决?谢谢了!

该用户从未签到

发表于 2010-1-25 21:50:17 | 显示全部楼层
遍历geonode节点可以得到顶点数组~~

该用户从未签到

 楼主| 发表于 2010-1-25 22:21:13 | 显示全部楼层
先谢谢回复啊。
我这个程序也是遍历了geode的,再遍历各drawable,不知道你说的方法是什么?
有例子否?谢谢了。

该用户从未签到

发表于 2010-1-26 08:27:31 | 显示全部楼层
“无法正确得到三角形数据”,您的意思是的得到的三个顶点有重复?还是说并不能得到所有的顶点?如果是前者,那么是正常情况,自己加以判断就可以;如果是后者,我个人认为是您的Geometry几何体数据本身存在问题。

该用户从未签到

 楼主| 发表于 2010-1-26 09:28:05 | 显示全部楼层
有一个师姐给我的程序可以看到三角形面片所所组成的样子,我把用osgViewer看到的图形的样子,跟三角形面片所组成的样子进行对比,发现有的模型在两种情况下看到的样子,相差很大。好像并不是你所的那两种情况。
例如:我有一个模型(osg文件),如果在程序中加了osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;运行结果的前几行是这样的(这是正确的情况)
union
{triangle
{<-0.474997,1.9,0.1895>,<0.475003,1.9,0.1895>,<0.475003,1.9,-0.38>}
triangle{<0.475003,1.9,-0.38>,<-0.474997,1.9,-0.38>,<-0.474997,1.9,0.1895>}
triangle{<-0.474997,1.9,-0.38>,<0.475003,1.9,-0.38>,<0.475003,-3.8e-007,-0.38>}
如果不加osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;运行结果的前几行则是(这是不正确的情况)
union
{triangle{<-51303.3,1898,90549.9>,<-52253.3,1898,90549.9>,<-52253.3,1898,91119.4>}
triangle{<-52253.3,1898,91119.4>,<-51303.3,1898,91119.4>,<-51303.3,1898,90549.9>}
triangle{<-51303.3,1898,91119.4>,<-52253.3,1898,91119.4>,<-52253.3,-2,91119.4>}
我不知道为什么对于同一个模型,加不加那两行代码,怎么运行出来结果如此不同。
谢谢了。

该用户从未签到

 楼主| 发表于 2010-1-26 09:30:04 | 显示全部楼层
好像并不是您所说的两种情况。刚刚少打了一个字

该用户从未签到

发表于 2013-1-22 12:46:05 | 显示全部楼层
我想问下 楼主的模型 是一个对点云进行三角剖分后的模型么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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