观察osg格式文件中如何处理多个节点共享一个子节点

来源:互联网 发布:深入浅出数据分析代码 编辑:程序博客网 时间:2024/05/17 09:26

下面一段程序中,共有三个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();
}

原创粉丝点击