osg中数据组织是以树形结构组成的,看一下下面类图:
osg::Geode和osg::Group节点都是继承自osg::Node。
Geode是叶节点,也就是不会再有子节点。叶节点的工作主要是保存可绘制物体。管理的节点都是继承自Drawable这个类,有一个或者多个Drawable对象。
Group组节点最为根节点或者其他节点。管理者众多其他的节点。
常用的节点总结:
- 空间变换节点:它可以改变自身在三维空间中的姿态和位置,进而影响子节点的姿态和位置,常用:Transform类来表达空间变换节点。
- 开关节点:一个场景中同时又很多节点,但是你在某一种情况下,不需要显示一些节点,也就是可以控制节点的显示与隐藏。常用:Switch和MulitiSwitch节点来表达开关节点和“课细分”的多重开关节点。
- 细节层次节点:常用的是根据对象和观察者的距离来决定使用使用模型,根据不同的距离使用不同的细节层次。常用:LOD(Level of Detail).
- 相机节点:通过不同角度去观看这些模型,也可以设置多个相机,在不同的窗口显示出来。常用:Camera。camera节点中所有的子节点都会渲染到这个相机的视窗中。Camera节点实现的基础是Transform节点,因为不用的角度的相机会影响到模型的姿态和位置;
- 投影节点:就是讲场景中的模型投影到二维平面上一个节点,它并不是一个投影转换节点,因为将三维投影到二维平面上是不需要考虑Projection节点内的位置和姿态的。
- 渲染属性节点:渲染属性是表达真实场景中重要的一部分要素,光照、雾效果、透明效果、纹理贴图等都属于属性效果。StateSet作为Node的成员变量,真正表达了是节点的属性值。
- 遮挡裁剪节点:这个节点可以通过场景裁剪的方式,提出那些不会被用户看到(背面、视线之外、被遮挡)或者不会过多影响绘制结果的对象,常用:OccluderNode,用于表达遮挡物的形状构造,他们不会被自己裁掉,而场景中的对象可能被OccluderNode节点则遮挡二忽略,从而加速绘制过程。
- 动态调度节点:有一些大规模的场景需要加载很多的节点,当一次性读入内存时,会占用大量的内存空间。因此就需要一种动态调用机制,对于可以实现动态调用的节点来说,当它的某些子节点对场景绘制没有用时,就会将子节点自动卸载掉。同样也可以动态加载不存在内存中的节点。常用类:PagedLOD节点。