今天课程分为两部分,第一部分我们学习一下Scene Graph理论知识,第二部分我们熟悉下OSG的源码。
Scene Graph
在OpenSceneGraph中,场景图(Scene Graph)通过树状层级结构高效管理3D对象。
场景图(Scene Graph)层级关系
以下是根节点、组节点和几何节点(Geode)的核心概念及层级关系:
根节点 (osg::Group)
│
└── 变换组节点 (osg::PositionAttitudeTransform)
│
├── 几何节点1 (osg::Geode) → 包含立方体
│
└── 子组节点 (osg::Group)
│
└── 几何节点2 (osg::Geode) → 包含球体
根节点(Root Node)
作用:场景图的顶层入口,所有其他节点均为其子孙节点。
类型:通常是osg::Group或osgViewer::Viewer关联的根节点。
特性:
- 无父节点。
- 作为场景遍历的起点,渲染时从根节点开始递归处理子节点。
组节点(Group Node)
作用:组织子节点,构建层次结构。支持嵌套,用于组合变换、状态或逻辑分组。
类型:基类为osg::Group,扩展类型包括osg::Transform(变换节点)、osg::Switch(开关节点)、osg::LOD(细节层次节点)等。
特性:
通过addChild()方法添加子节点(其他组节点或Geode)。
- 示例:一个“汽车”组节点可包含“车轮”、“车身”等子组节点,每个子组可进一步细分。
几何节点(Geode)
作用:叶子节点,保存实际几何数据(如顶点、法线、纹理坐标)。
类型:osg::Geode(Geometry Node)。
特性:
- 无子节点,通过addDrawable()添加osg::Drawable对象(如osg::Geometry)。
- 示例:一个Geode节点可包含立方体或球体的几何数据。
看的是不是云里雾里的,伟大的圣人王阳明说过,要知行合一,所以下面我们通过代码来实践。
代码实例
scene_graph.cpp
#include <osg/Geode>
#include <osg/Group>
#include <osg/ShapeDrawable>
#include <osgViewer/Viewer>
#include <osg/Material>
#include <osg/StateSet>
int main()
{
// 创建根节点
osg::ref_ptr<osg::Group> root = new osg::Group();
// 创建第一个组节点(红色方块组)
osg::ref_ptr<osg