开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天
1 OSG场景树节点
场景图形采用一种自顶向下的、分层的树状数据结构来组织空间数据集,以提升渲染的效率。例如,有一个房子,房子里面有窗户、门和家具等,这时房子场景图就可以描述为如图所示。
上面的场景中包含一个组节点—房子和3个子节,窗、门和家具,其中,每个子节点包含所需要绘制的信息。
场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息。根节点和各个组节点都可以有0个或多个子成员。在场景图形的最底部,各个叶节点包含了构成场景中物体的实际几何信息。由此,可以这样来描述场景树:OSG程序使用组节点来组织和排列场景中的几何体。
场景树通常包括了多种类型的节点,以执行各种各样的用户功能,例如,开关节点可以设置其子节点可用或不可用:细节层次(LOD)节点可以根据观察者的距离调用不同的子节点:变换节点可以改变子节点几何体的坐标变换状态。面向对象的场景图形使用继承的机制来提供这种多样性,所有的节点类都有一个共有的基类,同时各自派生出实现特定功能的方法。
2 OSG中的父节点与子节点
OSG主要包含3大基本类节点,即Node、Geode(叶节点)和Group(组节点)。OSG中其他的大部分节点都继承自Group节点,少部分继承自Node节点及Geode节点,但Geode和Group 均继承自Node 节点。
Geode(叶节点),顾名思义,作为叶节点,它不会再有其他的子节点,但它可以包含几何体信息。Geode的英文全称为Geometry Node,即几何体节点。
Node、Group和Geode的继承关系图如图所示。
除了继承自 Node 和Geode 以外的所有节点均继承自 Group节点。
osg::Node 类继承于osg::Object类,osg::Object类是应用程序无法直接实例化的虚基类,它提供了一系列接口,用于保存与获取节点名称,指定保存数据是静态的还是动态更改的,还继承osg::Referenced类的内存管理机制。
通常情况下,一个子节点至少有一个父节点,要获得该子节点的父节点指针,可以使用getParent()函数。 通过上图可知,OSG中的节点直接或间接地以 osg::Object和osg::Referenced为基类,继承它的 一系列的接口,用于保存和获取名称,同时定义自己特定的方法来执行不同功能。