osg demo20 输出模型所有结点

来源:互联网 发布:网络黑白 花无涯 在线 编辑:程序博客网 时间:2024/04/30 02:48
//DEMO20//功能:输出模型所有的顶点#include <osgDB/ReadFile>#include <osgViewer/Viewer>#include <osg/NodeVisitor>#include <osg/Geometry>#include <fstream>#include <iostream>//定义一个定点访问的nodevisitor,名字自己取class VertexExtractor:public osg::NodeVisitor{public ://所有的顶点osg::ref_ptr<osg::Vec3Array>extracted_verts;//构造函数,选择向下遍历全孩子的方式VertexExtractor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN){extracted_verts = new osg::Vec3Array;}//applyvoid apply(osg::Geode& geode){//看看有多少可绘制节点for(unsigned int i=0;i<geode.getNumDrawables();++i){osg::Geometry* geom = dynamic_cast<osg::Geometry*>(geode.getDrawable(i));if(!geom)continue;//得到可绘制节点的定点序列osg::Vec3Array * verts =dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());if(!verts)continue;//把顶点序列插入到顶点集中以便输出extracted_verts->insert(extracted_verts->end(),verts->begin(),verts->end());}}};int main(){osgViewer::Viewer viewer;//读取模型osg::Node* rootNode = osgDB::readNodeFile("glider.osg");//申请一个对象,nodevisitor的对象VertexExtractor ivea;//acceptrootNode->accept(ivea);//设置场景数据viewer.setSceneData(rootNode);//实现viewer.realize();//输出到C盘下的test.vertexs文件中,可用写字板打开查看std::ofstream out("c:\\test.vertexs");int size_t = ivea.extracted_verts.get()->size();std::vector<osg::Vec3>::iterator iter = ivea.extracted_verts.get()->begin();for(int i=0;i<size_t;i++){out<<iter->x()<<"   "<<iter->y()<<"   "<<iter->z()<<std::endl;iter++;}std::cout<<"输出所有节点完毕"<<std::endl;return 0;}

0 0
原创粉丝点击