osg自学笔记1——《OpenSceneGraph 快速入门指导》

濮阳霄
2023-12-01

《OpenSceneGraph Quick Start Guide》学习笔记

《OpenSceneGraph Quick Start Guide》(《OpenSceneGraph 快速入门指导》)
中文论坛有下载

1、 1.3 运行 osgviewer

快速显示一个模型,并了解模型的应用。

2、1.5 场景图形初步

了解节点什么的。类似ogre,有个概念就可以了。

3、 1.6 OpenSceneGraph 概览

概况各个库和类。有一定了解后再看。

4、2.1 内存管理

讲解智能指针的机制和使用。

5、2.2 叶节点(Geode)和几何信息

用几何的顶点和颜色制作了一个图形,然后保存成osg文件。用osgviever程序打开显示。

后面都是对代码的解释,和扩展说明。

1、osg::Vec2,osg::Vec2Array,osg::Vec3Array

所有的数组类型均继承自 std::vector,
除了简单的向量存储以外,这些类还提供了完整的有关长度计算、点乘和叉乘、向量加法、向量矩阵乘法的运算函数

2、Drawables 类

osg::Drawable 类是个虚类,子类如下:
osg::DrawPixels类,封装了 glDrawPixels()的相关功能;
osg::ShapeDrawable类,提供了一些已经定义好的几何体的使用接口,如圆柱体和球;
osg::Geometry类,自定义几何体,使用最为灵活,也最为广泛的一个子类。

3、叶节点(Geode)

作为叶节点,osg::Geode 不会再有子节点,但是它可以包含几何体信息。
Geode 这个名字是“geometry node”的简拼,意即包含几何信息的节点。
Geode 提供了 addDrawable()方法来关联应用程序中的几何信息。Geode::addDrawable()将一个 Drawable 指针作为传入的参数。

6、2.3 组节点(Group)

在对它们进行介绍之后,本节还会对三个常用的继承自 Group 的类作
逐一讲解,它们分别是 Transform(变换),LOD(细节层次)和 Switch(开关)
节点。

1、子接口(管理子节点的接口)略

2、2.3.2 父接口

注意,osg::Node::ParentList 是一个保存标准 C++指针的 std::vector,不使用ref_ptr<>.
注意:通常情况下,一个节点有一个父节点(getNumParents()返回 0),要获取这个父节点的指针,可以调用 getParent( 0 )。
注意:多个父节点小知识。

3、2.3.3 变换节点(Transform)

Transform 类是一个无法由应用程序实例化的虚基类。用户应当使用 osg::MatrixTransform 或osg::PositionAttitudeTransform 来替代它

???多个紧密排列的 Transform 节点可以创建连续级联的变换,
Matrix 采用了左乘(premultiplication)操作,这一点与 OpenGL 文档中所述的 v’ = TRv 正好相反。
如果要对一个 Geode 使用上述变换,首先应该创建一个包含矩阵 T 的 MatrixTransform 节点,向其添加一个包含矩阵 R 的 MatrixTransform 子节点,然后再向这个旋转变换节点添加子节点 Geode。

  • 变换节点(Transform)的几个应用子类如下:
    • 矩阵变换节点(MatrixTransform类)的基本调用
    • 位置属性变换节点(PositionAttitudeTransform)

4、2.3.4 细节层次节点(LOD)

所有倾斜摄影显示需要的LOD功能,这个类里面都实现了。仔细看这个类说明api。

  • 用到的选项如下:
    • osg::LOD::DISTANCE_FROM_EYE_POINT
    • osg::LOD::PIXEL_SIZE_ON_SCREEN 节点在屏幕上的像素大小
    • osg::LOD::USE_BOUNDING_SPHERE_CENTER 包络球

5、2.3.5 开关节点(Switch)

使用 osg::Switch 节点可以渲染或者跳过指定的子节点。Switch 类的典型用
法有,根据当前渲染的负荷有选择地渲染子图形以实现渲染性能的均衡,或者在
游戏的界面和层级之间有选择地切换。

7、2.4 渲染状态(Rendering State)

用户的应用程序需要在 osg::StateSet 中设置渲染状态。用户可以将 StateSet
关联到场景图形中的任意一个节点(Node),或者关联到 Drawable 类。

  • 如果要设置渲染状态的值,用户程序需要执行以下几步操作:
    • z 为将要设置状态的 Node 或 Drawable 对象提供一个 StateSet 实例。
    • z 在 StateSet 实例中设置状态的渲染模式和渲染属性。

要从某个 Node 或 Drawable 对象中直接获得一个 StateSet 实例,使用下面的
方法:

osg::StateSet* state = obj->getOrCreateStateSet(); 

在上面的程序段中,obj是一个Node或Drawable类实例;getOrCreateStateSet()
是这些类定义的方法。这个方法返回一个指向 StateSet 实例的指针,该实例属于
obj。如果 obj 还没有设置过与之关联的 StateSet,那么这个方法返回一个新指针
并将其关联到 obj 上。

1、2.4.1 渲染属性(Attribute)和渲染模式(Mode)

2.4.3 渲染状态设置示例 几个渲染状态设置的代码实例。

2.4.4 纹理映射
设置纹理坐标、读取图片、管理纹理内存释放的函数

tex->setUnRefImageDataAfterApply( true );

纹理状态(内容未看,暂略)

2.4.5 光照(内容未看,暂略)
包含光源,材质等内容。

8、2.5 文件 I/O

osgDB 库提供了用户程序读取和写入 2D 图像和 3D 模型文件的函数接口。
osgDB 库还负责管理 OSG 的插件系统,以实现对不同文件格式的支持。
文件插件的调用,文件的读取和写入,插件的搜索和注册。

9、2.6 NodeKit 与 osgText

所谓 NodeKit 就是指一种开发集成库,它扩展自 OSG 核心功能的特定节点类(Node),渲染属性类(StateAttribute)和绘图类(Drawable),并且使用 osg 包装类(wrapper)对这些新的功能类提供.osg文件格式的支持。

本节将提供一个使用osgText 的例子,用来在场景图形中显示纹理贴图的文字。

2.6.1 osgText 组件

包含文字显示和字体相关的所有操作。

2.6.4 .osg 文件格式

可以把场景保存成一个osg文件进行输出和查错。
osg文件是文本格式的,这里还通过实例讲解了osg文件的基本格式。

3、在用户程序中使用OpenSceneGraph

3.1 渲染

概况说明渲染各个库。

3.1.1 Viewer 类

osgViewer::Viewer 对象的渲染循环,每次渲染一帧。

while (!viewer.done()) 
{ 
//设置camera等各种渲染配置

 // 绘制下一帧
 viewer.frame(); 
}
  • camera的控制:
    • 1、 通过矩阵直接控制;
    • 2、通过camera控制器控制,比如 osgGA::TrackballManipulator 对象
      来控制摄像机的工作。osgGA 库定义了一些常用的控制器类。 Viewer::run()函数中将自动创建一个osgGA::TrackballManipulator 对象。

其他用途:设置清屏颜色,将清除颜色、深度和模板缓存。

3.1.2 SimpleViewer 和 CompositeViewer

SimpleViewer 类不会主动创建窗口或者设备上下文。相反,它需要依赖用户程序来创建窗口、上下文,并将其激活为当前设备。
CompositeViewer 类可以支持一个或多个场景的多个视口显示,并允许用户程序指定其渲染顺序。CompositeViewer 可以支持渲染到纹理(render-to-texture,RTT)的操作.

3.2 动态更改

本节将介绍一些与场景图形动态更改相关的基本技术。
1、数据变度
2、回调函数
3、搜索整个场景,或鼠标点选

3.2.1 数据变度(暂时略)

关于多线程渲染是数据更新同步问题。目前不会用到,暂时略。

3.2.2 回调

继承 osg::NodeCallback 类的回调函数。通过实例进行演示说明。

3.2.3 NodeVisitor 类

用于遍历整个场景图形的节点。还有实例代码。但是没怎么看明白,有些地方还是不理解。

3.2.4 用户选择

捕获鼠标事件,
TrackballManipulator 派生自 osgGA::GUIEventHandler 类

交集(没太理解,有点困)
osgUtil::IntersectionVisitor 类继承自 NodeVisitor,

————看完了————

 类似资料: