OSG 场景的组织结构

时间:2023-02-03 16:08:49

OSG 场景的组织结构

本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:

  • 节点的定义与种类
  • 节点的访问
  • 重要节点的功能实现

节点的定义与种类

osg采用包围体层次来实现场景图的管理,这里的“包围体”指的是将一组物体完全封闭在一个简单空间形体中,从而提高各种检测的运算速度。常见的有包围球和包围盒,还记得上一章中的包围球的定义吗?
采用包围体层次的场景图通常采用梳妆结构来保存信息。一棵场景树,有一个根节点,多个枝节结点和多个叶子结点,每个节点都有自己的子树,该结点的包围体就包围了其本身及其子树,每个节点都有包围体,就构成了层层包围体。这样来说,包围体的层次就清晰分明,对场景对象进行一系列裁剪,相交测试和碰撞测试时就不会互相影响。
-场景节点的基类:Node类
-如果我们希望强制重新计算并获取包围球数据,编写如下代码
node->dirtyBound();//更新节点的包围体
osg::BoundingSphere& bs=node->getBound()//获取包围球数据,其中自动调用了一些计算类的函数,获得其中心位置和半径
-节点类的父子关系这里需要注意的是,多个父节点共享一个子节点的情形,我们把这种现象称之为“实例化”
-为了管理和设置父节点的列表,我们需要为Node类增加一系列的接口函数,以例子为说明,获取和操作结点的每一个父节点的方法如下:
for(遍历每个父节点)
{const osg::Group*parent=node.getParent(i);}
-叶节点Geode
假如现有多个可绘制体drawable1,drawable2,需要加入到一个叶结点中,那么所需编写的代码如下:
osg::ref_ptr<osg::Geode>geode=new osg::Geode;
geode->addDrawable(drawable1);
geode->addDrawable(drawable2);//从叶子结点geode中追加一个可绘制对象名为drawable2

osg::Drawable* drawable=geode->getDrawable(i);//从叶子结点geode中获取并操作索引位置为i的可绘制体
-组结点Group类
group->addChild(node);//向组结点中追加一个子节点
osg::Node*anoter_node2=group->gerChild(1);//获取索引位置为1的子节点
组结点的子节点可以是另一个组结点,也可以是一个或多个叶子结点