《OpenSceneGraph Quick Start Guide》(《OpenSceneGraph 快速入门指导》)
中文论坛有下载
快速显示一个模型,并了解模型的应用。
了解节点什么的。类似ogre,有个概念就可以了。
概况各个库和类。有一定了解后再看。
讲解智能指针的机制和使用。
用几何的顶点和颜色制作了一个图形,然后保存成osg文件。用osgviever程序打开显示。
后面都是对代码的解释,和扩展说明。
所有的数组类型均继承自 std::vector,
除了简单的向量存储以外,这些类还提供了完整的有关长度计算、点乘和叉乘、向量加法、向量矩阵乘法的运算函数
osg::Drawable 类是个虚类,子类如下:
osg::DrawPixels类,封装了 glDrawPixels()的相关功能;
osg::ShapeDrawable类,提供了一些已经定义好的几何体的使用接口,如圆柱体和球;
osg::Geometry类,自定义几何体,使用最为灵活,也最为广泛的一个子类。
作为叶节点,osg::Geode 不会再有子节点,但是它可以包含几何体信息。
Geode 这个名字是“geometry node”的简拼,意即包含几何信息的节点。
Geode 提供了 addDrawable()方法来关联应用程序中的几何信息。Geode::addDrawable()将一个 Drawable 指针作为传入的参数。
在对它们进行介绍之后,本节还会对三个常用的继承自 Group 的类作
逐一讲解,它们分别是 Transform(变换),LOD(细节层次)和 Switch(开关)
节点。
注意,osg::Node::ParentList 是一个保存标准 C++指针的 std::vector,不使用ref_ptr<>.
注意:通常情况下,一个节点有一个父节点(getNumParents()返回 0),要获取这个父节点的指针,可以调用 getParent( 0 )。
注意:多个父节点小知识。
Transform 类是一个无法由应用程序实例化的虚基类。用户应当使用 osg::MatrixTransform 或osg::PositionAttitudeTransform 来替代它
???多个紧密排列的 Transform 节点可以创建连续级联的变换,
Matrix 采用了左乘(premultiplication)操作,这一点与 OpenGL 文档中所述的 v’ = TRv 正好相反。
如果要对一个 Geode 使用上述变换,首先应该创建一个包含矩阵 T 的 MatrixTransform 节点,向其添加一个包含矩阵 R 的 MatrixTransform 子节点,然后再向这个旋转变换节点添加子节点 Geode。
所有倾斜摄影显示需要的LOD功能,这个类里面都实现了。仔细看这个类说明api。
使用 osg::Switch 节点可以渲染或者跳过指定的子节点。Switch 类的典型用
法有,根据当前渲染的负荷有选择地渲染子图形以实现渲染性能的均衡,或者在
游戏的界面和层级之间有选择地切换。
用户的应用程序需要在 osg::StateSet 中设置渲染状态。用户可以将 StateSet
关联到场景图形中的任意一个节点(Node),或者关联到 Drawable 类。
要从某个 Node 或 Drawable 对象中直接获得一个 StateSet 实例,使用下面的
方法:
osg::StateSet* state = obj->getOrCreateStateSet();
在上面的程序段中,obj是一个Node或Drawable类实例;getOrCreateStateSet()
是这些类定义的方法。这个方法返回一个指向 StateSet 实例的指针,该实例属于
obj。如果 obj 还没有设置过与之关联的 StateSet,那么这个方法返回一个新指针
并将其关联到 obj 上。
2.4.3 渲染状态设置示例 几个渲染状态设置的代码实例。
2.4.4 纹理映射
设置纹理坐标、读取图片、管理纹理内存释放的函数
tex->setUnRefImageDataAfterApply( true );
纹理状态(内容未看,暂略)
2.4.5 光照(内容未看,暂略)
包含光源,材质等内容。
osgDB 库提供了用户程序读取和写入 2D 图像和 3D 模型文件的函数接口。
osgDB 库还负责管理 OSG 的插件系统,以实现对不同文件格式的支持。
文件插件的调用,文件的读取和写入,插件的搜索和注册。
所谓 NodeKit 就是指一种开发集成库,它扩展自 OSG 核心功能的特定节点类(Node),渲染属性类(StateAttribute)和绘图类(Drawable),并且使用 osg 包装类(wrapper)对这些新的功能类提供.osg文件格式的支持。
本节将提供一个使用osgText 的例子,用来在场景图形中显示纹理贴图的文字。
包含文字显示和字体相关的所有操作。
可以把场景保存成一个osg文件进行输出和查错。
osg文件是文本格式的,这里还通过实例讲解了osg文件的基本格式。
概况说明渲染各个库。
osgViewer::Viewer 对象的渲染循环,每次渲染一帧。
while (!viewer.done())
{
//设置camera等各种渲染配置
// 绘制下一帧
viewer.frame();
}
其他用途:设置清屏颜色,将清除颜色、深度和模板缓存。
SimpleViewer 类不会主动创建窗口或者设备上下文。相反,它需要依赖用户程序来创建窗口、上下文,并将其激活为当前设备。
CompositeViewer 类可以支持一个或多个场景的多个视口显示,并允许用户程序指定其渲染顺序。CompositeViewer 可以支持渲染到纹理(render-to-texture,RTT)的操作.
本节将介绍一些与场景图形动态更改相关的基本技术。
1、数据变度
2、回调函数
3、搜索整个场景,或鼠标点选
关于多线程渲染是数据更新同步问题。目前不会用到,暂时略。
继承 osg::NodeCallback 类的回调函数。通过实例进行演示说明。
用于遍历整个场景图形的节点。还有实例代码。但是没怎么看明白,有些地方还是不理解。
捕获鼠标事件,
TrackballManipulator 派生自 osgGA::GUIEventHandler 类
交集(没太理解,有点困)
osgUtil::IntersectionVisitor 类继承自 NodeVisitor,
————看完了————