📄 vertexextractor.h
字号:
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/NodeVisitor>
#include <osg/Vec3>
#include <osg/PrimitiveSet>
#include <osgUtil/SmoothingVisitor>
#include <osgDB/WriteFile>
#include <osg/Material>
#include <osg/LightSource>
#include <osg/StateSet>
#include <osg/StateAttribute>
#include <osg/BoundingSphere>
//class VertexExtractor,从OSG文件中取出点坐标,法向量,存储在osg::Vec3Array*数组中
class VertexExtractor : public osg::NodeVisitor
{
public:
osg::Vec3Array* extracted_verts;
osg::Vec3Array* extracted_normal;
unsigned int i;
osg::MatrixList mlist;
VertexExtractor() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
{
extracted_verts = new osg::Vec3Array;
extracted_normal = new osg::Vec3Array;
}
void apply( osg::Geode& geode )
{
for(i=0; i<geode.getNumDrawables(); i++ )
{
osg::Geometry* geom = dynamic_cast<osg::Geometry*>( geode.getDrawable(i) );
mlist=geode.getWorldMatrices();
if( geom &&(geom->getPrimitiveSet(0)->getMode()==osg::PrimitiveSet::TRIANGLES||geom->getPrimitiveSet(0)->getMode()==osg::PrimitiveSet::TRIANGLE_STRIP ))
{
osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>( geom->getVertexArray() );
if( verts )
extracted_verts->insert( extracted_verts->end(), verts->begin(), verts->end() );
for(int j=0;j<extracted_verts->size();j++)
extracted_verts->at(j)=extracted_verts->at(j)*mlist.at(0);
osg::Vec3Array* norm = dynamic_cast<osg::Vec3Array*>( geom->getNormalArray() );
if( norm )
extracted_normal->insert( extracted_normal->end(), norm->begin(), norm->end() );
/*int z=extracted_verts->size();
for(int j=0;j<z;j=j+18)
{
osg::Vec3 temp_b=extracted_verts->at(j);
osg::Vec3 temp_c=extracted_verts->at(j+1);
osg::Vec3 temp_d=extracted_verts->at(j+2);
osg::Vec3 temp_a=(temp_b+temp_c+temp_d)/3;
osg::Vec3 temp_bc=(temp_b+temp_c)/2;
osg::Vec3 temp_cd=(temp_c+temp_d)/2;
osg::Vec3 temp_db=(temp_d+temp_b)/2;
osg::Vec3 n=extracted_normal->at(j);
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_bc);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_bc);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+6,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+7,temp_cd);
extracted_verts->insert(extracted_verts->begin()+j+8,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+9,temp_cd);
extracted_verts->insert(extracted_verts->begin()+j+10,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+11,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+12,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+13,temp_db);
extracted_verts->insert(extracted_verts->begin()+j+14,temp_a);
extracted_verts->insert(extracted_verts->begin()+j+15,temp_db);
extracted_verts->insert(extracted_verts->begin()+j+16,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+17,temp_a);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,n);
extracted_normal->insert(extracted_normal->begin()+j+1,n);
extracted_normal->insert(extracted_normal->begin()+j+2,n);
extracted_normal->insert(extracted_normal->begin()+j+3,n);
extracted_normal->insert(extracted_normal->begin()+j+4,n);
extracted_normal->insert(extracted_normal->begin()+j+5,n);
extracted_normal->insert(extracted_normal->begin()+j+6,n);
extracted_normal->insert(extracted_normal->begin()+j+7,n);
extracted_normal->insert(extracted_normal->begin()+j+8,n);
extracted_normal->insert(extracted_normal->begin()+j+9,n);
extracted_normal->insert(extracted_normal->begin()+j+10,n);
extracted_normal->insert(extracted_normal->begin()+j+11,n);
extracted_normal->insert(extracted_normal->begin()+j+12,n);
extracted_normal->insert(extracted_normal->begin()+j+13,n);
extracted_normal->insert(extracted_normal->begin()+j+14,n);
extracted_normal->insert(extracted_normal->begin()+j+15,n);
extracted_normal->insert(extracted_normal->begin()+j+16,n);
extracted_normal->insert(extracted_normal->begin()+j+17,n);
z=extracted_verts->size();
}*/
int z=extracted_verts->size();
for(int j=0;j<z;j=j+48)
{
osg::Vec3 temp_b=extracted_verts->at(j);
osg::Vec3 temp_c=extracted_verts->at(j+1);
osg::Vec3 temp_d=extracted_verts->at(j+2);
osg::Vec3 temp_bc1=(temp_b*3+temp_c)/4;
osg::Vec3 temp_bc2=(temp_b+temp_c)/2;
osg::Vec3 temp_bc3=(temp_b+temp_c*3)/4;
osg::Vec3 temp_cd1=(temp_c*3+temp_d)/4;
osg::Vec3 temp_cd2=(temp_c+temp_d)/2;
osg::Vec3 temp_cd3=(temp_c+temp_d*3)/4;
osg::Vec3 temp_bd1=(temp_b*3+temp_d)/4;
osg::Vec3 temp_bd2=(temp_b+temp_d)/2;
osg::Vec3 temp_bd3=(temp_b+temp_d*3)/4;
osg::Vec3 temp_e1=(temp_bc2+temp_bd2)/2;
osg::Vec3 temp_e2=(temp_bd3+temp_bc3*2)/3;
osg::Vec3 temp_e3=(temp_bd3*2+temp_bc3)/3;
osg::Vec3 n=extracted_normal->at(j);
extracted_verts->erase(extracted_verts->begin()+j,extracted_verts->begin()+j+3);
//1-4
extracted_verts->insert(extracted_verts->begin()+j,temp_b);
extracted_verts->insert(extracted_verts->begin()+j+1,temp_bc1);
extracted_verts->insert(extracted_verts->begin()+j+2,temp_bd1);
extracted_verts->insert(extracted_verts->begin()+j+3,temp_bc1);
extracted_verts->insert(extracted_verts->begin()+j+4,temp_bc2);
extracted_verts->insert(extracted_verts->begin()+j+5,temp_e1);
extracted_verts->insert(extracted_verts->begin()+j+6,temp_bc1);
extracted_verts->insert(extracted_verts->begin()+j+7,temp_e1);
extracted_verts->insert(extracted_verts->begin()+j+8,temp_bd1);
extracted_verts->insert(extracted_verts->begin()+j+9,temp_bd1);
extracted_verts->insert(extracted_verts->begin()+j+10,temp_e1);
extracted_verts->insert(extracted_verts->begin()+j+11,temp_bd2);
//5-8
extracted_verts->insert(extracted_verts->begin()+j+12,temp_bc2);
extracted_verts->insert(extracted_verts->begin()+j+13,temp_bc3);
extracted_verts->insert(extracted_verts->begin()+j+14,temp_e2);
extracted_verts->insert(extracted_verts->begin()+j+15,temp_bc2);
extracted_verts->insert(extracted_verts->begin()+j+16,temp_e2);
extracted_verts->insert(extracted_verts->begin()+j+17,temp_e1);
extracted_verts->insert(extracted_verts->begin()+j+18,temp_e1);
extracted_verts->insert(extracted_verts->begin()+j+19,temp_e2);
extracted_verts->insert(extracted_verts->begin()+j+20,temp_e3);
extracted_verts->insert(extracted_verts->begin()+j+21,temp_e1);
extracted_verts->insert(extracted_verts->begin()+j+22,temp_e3);
extracted_verts->insert(extracted_verts->begin()+j+23,temp_bd2);
//9-12
extracted_verts->insert(extracted_verts->begin()+j+24,temp_bd2);
extracted_verts->insert(extracted_verts->begin()+j+25,temp_e3);
extracted_verts->insert(extracted_verts->begin()+j+26,temp_bd3);
extracted_verts->insert(extracted_verts->begin()+j+27,temp_bc3);
extracted_verts->insert(extracted_verts->begin()+j+28,temp_c);
extracted_verts->insert(extracted_verts->begin()+j+29,temp_cd1);
extracted_verts->insert(extracted_verts->begin()+j+30,temp_bc3);
extracted_verts->insert(extracted_verts->begin()+j+31,temp_cd1);
extracted_verts->insert(extracted_verts->begin()+j+32,temp_e2);
extracted_verts->insert(extracted_verts->begin()+j+33,temp_cd1);
extracted_verts->insert(extracted_verts->begin()+j+34,temp_cd2);
extracted_verts->insert(extracted_verts->begin()+j+35,temp_e2);
//13-16
extracted_verts->insert(extracted_verts->begin()+j+36,temp_e2);
extracted_verts->insert(extracted_verts->begin()+j+37,temp_cd2);
extracted_verts->insert(extracted_verts->begin()+j+38,temp_e3);
extracted_verts->insert(extracted_verts->begin()+j+39,temp_cd2);
extracted_verts->insert(extracted_verts->begin()+j+40,temp_cd3);
extracted_verts->insert(extracted_verts->begin()+j+41,temp_e3);
extracted_verts->insert(extracted_verts->begin()+j+42,temp_e3);
extracted_verts->insert(extracted_verts->begin()+j+43,temp_cd3);
extracted_verts->insert(extracted_verts->begin()+j+44,temp_bd3);
extracted_verts->insert(extracted_verts->begin()+j+45,temp_cd3);
extracted_verts->insert(extracted_verts->begin()+j+46,temp_d);
extracted_verts->insert(extracted_verts->begin()+j+47,temp_bd3);
extracted_normal->erase(extracted_normal->begin()+j,extracted_normal->begin()+j+3);
extracted_normal->insert(extracted_normal->begin()+j,n);
extracted_normal->insert(extracted_normal->begin()+j+1,n);
extracted_normal->insert(extracted_normal->begin()+j+2,n);
extracted_normal->insert(extracted_normal->begin()+j+3,n);
extracted_normal->insert(extracted_normal->begin()+j+4,n);
extracted_normal->insert(extracted_normal->begin()+j+5,n);
extracted_normal->insert(extracted_normal->begin()+j+6,n);
extracted_normal->insert(extracted_normal->begin()+j+7,n);
extracted_normal->insert(extracted_normal->begin()+j+8,n);
extracted_normal->insert(extracted_normal->begin()+j+9,n);
extracted_normal->insert(extracted_normal->begin()+j+10,n);
extracted_normal->insert(extracted_normal->begin()+j+11,n);
extracted_normal->insert(extracted_normal->begin()+j+12,n);
extracted_normal->insert(extracted_normal->begin()+j+13,n);
extracted_normal->insert(extracted_normal->begin()+j+14,n);
extracted_normal->insert(extracted_normal->begin()+j+15,n);
extracted_normal->insert(extracted_normal->begin()+j+16,n);
extracted_normal->insert(extracted_normal->begin()+j+17,n);
extracted_normal->insert(extracted_normal->begin()+j+18,n);
extracted_normal->insert(extracted_normal->begin()+j+19,n);
extracted_normal->insert(extracted_normal->begin()+j+20,n);
extracted_normal->insert(extracted_normal->begin()+j+21,n);
extracted_normal->insert(extracted_normal->begin()+j+22,n);
extracted_normal->insert(extracted_normal->begin()+j+23,n);
extracted_normal->insert(extracted_normal->begin()+j+24,n);
extracted_normal->insert(extracted_normal->begin()+j+25,n);
extracted_normal->insert(extracted_normal->begin()+j+26,n);
extracted_normal->insert(extracted_normal->begin()+j+27,n);
extracted_normal->insert(extracted_normal->begin()+j+28,n);
extracted_normal->insert(extracted_normal->begin()+j+29,n);
extracted_normal->insert(extracted_normal->begin()+j+30,n);
extracted_normal->insert(extracted_normal->begin()+j+31,n);
extracted_normal->insert(extracted_normal->begin()+j+32,n);
extracted_normal->insert(extracted_normal->begin()+j+33,n);
extracted_normal->insert(extracted_normal->begin()+j+34,n);
extracted_normal->insert(extracted_normal->begin()+j+35,n);
extracted_normal->insert(extracted_normal->begin()+j+36,n);
extracted_normal->insert(extracted_normal->begin()+j+37,n);
extracted_normal->insert(extracted_normal->begin()+j+38,n);
extracted_normal->insert(extracted_normal->begin()+j+39,n);
extracted_normal->insert(extracted_normal->begin()+j+40,n);
extracted_normal->insert(extracted_normal->begin()+j+41,n);
extracted_normal->insert(extracted_normal->begin()+j+42,n);
extracted_normal->insert(extracted_normal->begin()+j+43,n);
extracted_normal->insert(extracted_normal->begin()+j+44,n);
extracted_normal->insert(extracted_normal->begin()+j+45,n);
extracted_normal->insert(extracted_normal->begin()+j+46,n);
extracted_normal->insert(extracted_normal->begin()+j+47,n);
z=extracted_verts->size();
}
}
}
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -