转自:http://blog.csdn.net/timothyfly/article/details/7826139
osg格式文件中如何处理多个节点共享一个子节点
下面一段程序中,共有三个Group类型根节点:root,grp1和grp2;两个Geode类型节点:geode1和geode2。他们之间的从属关系是:grp1,grp2和geode2是root的孩子,geode1和geode2是grp1的孩子,geode2是grp2的孩子。
.osg格式的文件存储像geode2这个的节点时,采用‘Use‘这个关键词。
---------------------------------------------------------------------------------------------
.osg文件内容:
Group {
name "root"
nodeMask 0xffffffff
cullingActive TRUE
num_children 3
Group {
UniqueID Group_0
name "grp1"
nodeMask 0xffffffff
cullingActive TRUE
num_children 2
Geode {
UniqueID Geode_1
name "geode1"
nodeMask 0xffffffff
cullingActive TRUE
num_drawables 1
Geometry {
useDisplayList TRUE
useVertexBufferObjects FALSE
PrimitiveSets 1
{
DrawArrays LINE_STRIP 0 3
}
VertexArray Vec3Array 3
{
0 1 0
0 0 0
1 1 0
}
}
}
Geode {
UniqueID Geode_2
name "geode2"
nodeMask 0xffffffff
cullingActive TRUE
num_drawables 1
Geometry {
useDisplayList TRUE
useVertexBufferObjects FALSE
PrimitiveSets 1
{
DrawArrays LINE_STRIP 0 3
}
VertexArray Vec3Array 3
{
1 0 0
2 1 0
2 0 0
}
}
}
}
Group {
UniqueID Group_3
name "grp2"
nodeMask 0xffffffff
cullingActive TRUE
num_children 1
Use Geode_2
}
Use Geode_2
}
-----------------------------------------------------------------------------------------
osg程序代码:
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Point>
#include <osg/LineWidth>
#include <osgDB/WriteFile>
// 根据一组点集生成一个Geode对象
osg::ref_ptr< osg::Geode > createProfileGeode( int size, osg::Vec3 *points )
{
osg::ref_ptr< osg::Geode > geode = new osg::Geode();
osg::ref_ptr< osg::Geometry > pointsGeom = new osg::Geometry();
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array( size, points);
pointsGeom->setVertexArray(vertices);
pointsGeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP,0,vertices->size()));
geode->addDrawable(pointsGeom);
return geode.release();
}
int main( int argc, char** argv )
{
osg::Vec3 myCoords1[]=
{
osg::Vec3(0,1,0),
osg::Vec3(0,0,0),
osg::Vec3(1,1,0)
};
osg::Vec3 myCoords2[]=
{
osg::Vec3(1,0,0),
osg::Vec3(2,1,0),
osg::Vec3(2,0,0)
};
osg::ref_ptr< osg::Geode > geode1 = createProfileGeode( sizeof(myCoords1)/sizeof(myCoords1[0]), myCoords1 );
osg::ref_ptr< osg::Geode > geode2 = createProfileGeode( sizeof(myCoords2)/sizeof(myCoords2[0]), myCoords2 );
geode1->setName("geode1");
geode2->setName("geode2");
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Group> grp1 = new osg::Group;
osg::ref_ptr<osg::Group> grp2 = new osg::Group;
root->setName("root");
grp1->setName("grp1");
grp2->setName("grp2");
grp1->addChild(geode1);
grp1->addChild(geode2);//geode2的第一个父节点
grp2->addChild(geode2);//geode2的第二个父节点
root->addChild( grp1 );
root->addChild( grp2 );
root->addChild(geode2);//geode2的第三个父节点
osgDB::writeNodeFile( *root, "test.osg" );
osgViewer::Viewer viewer;
viewer.setSceneData( root.get() );
return viewer.run();
}
原文:http://www.cnblogs.com/lyggqm/p/5267171.html