一、初始osg
三维渲染引擎:为了实现三维场景图形的结构管理和绘制而提供的一系列API的集合。包括构建层和交互层。
Crystal Space、Java3D、Unreal……
osg库:构件场景图形的场景图形节点类、用作向量和矩阵运算的类;可绘制体和几何体类;用于描述和管理渲染状态的类;以及图形程序所需的典型功能类。
osgDB库:用于2D和3D文件读写的插件类注册器,以及用于访问和读写这些插件的特定功能类;数据的动态分页调度机制
osgUtil库:实用工具库。包括场景图形数据统计和优化工具、渲染后台工具、场景剪裁工具;以及大量几何操作相关的类
osgGA库:提供各种视景窗口交互事件的管理工具,用于构建一个与平台无关的人机设备抽象层
osgView库:视景器工具库
osgAnimation:场景动画处理库
osgFX:场景特效库
osgManipulator:场景对象操控库
osgParticle:粒子特效库
osgShadow:阴影特效库
osgSim:仿真工具库
osgTerrain:地形处理库
osgText:文字处理库
osgVolume:体渲染实现库
osgWidget:三维控件库
三、开发预备知识
3.1 向量
向量的点积(数量积、内积),也就是两个向量各分向量乘积之和,结果为一个标量
AB = |A||B|cos<A,B>=x1*x2 + y1*y2 + z1*z2
向量的叉积(向量积),结果为一个垂直于原向量的新向量。
|A×B| = |A||B|sin<A,B> A×B=( y1z2 - y2z1 , x1z2 - x2z1 , x1y2 - x2y1)
四元数 一种由三个复数和一个实数组成的复杂数字系统xyzw。可以表达物体绕任意向量轴的旋转。http://blog.csdn.net/chenlanjie842179335/article/details/8039031
转置 加减 点积(两个四元数各分量乘积之和) 共轭 Quat表达
矩阵 加减 数乘 转置 逆 osgMatrixd
包围体 包围球和轴对称包围盒 osgBoundingBoxImpl
3.2数组对象
OSG的数组用途:1.表达单精度或双精度的浮点数据,包括数值、多维向量等,以便用于OpenGL顶点坐标(vec3)、颜色(vec4)、纹理坐标(vec2)等属性数组的设置;2、表达顶点数据的索引,此时数组的元素一般是整数类型,索引数组在绘制OpenGL几何图元时尤为常见。
osg::Array osg::IndexArray
3.3 内存管理机制
OSG中新建的场景对象建议使用ref_ptr进行内存的分配和管理。
新建对象作为函数结果返回时,建议使用release()传递,并尽快引入到别的场景对象中。
参照对象 是引用计数和对象自动卸载的实际执行者 osg::Referenced。主要的派生类为osg::Object
四、场景的组织结构
4.1节点的定义与种类
osg采用包围体层次(Bounding Volume Hierarchy,BVH)来实现场景图形的管理。包围球、包围盒。采用树状结构来保存信息。一颗场景数:一个根节点,多级内部的枝节节点,以及多个末端的叶子节点。根节点和枝节节点负责构件树的层次,以及完成某种特定的功能;而叶子节点则保存某一个或多个可绘制对象的信息。所有节点都维护一个自身的包围体。
osg::Node表达一个基本节点,基类。需要一个BoundingSphere表达自己的包围球形体。
叶节点osg::Geode几何节点,保存和管理一个或多个可绘制物体的信息,这些可绘制形体的容纳者为Drawable类,包括几何模型、图像、文字。
组节点Group osg::Group,作为场景树结构的枝节存在,将子节点成组进行管理和调度。
(1)空间变换节点, 它可以改变自身在三维空间中的位置和姿态,进而影响子节点的控件位置变化。使用Transform类表达
(2)开关节点, 分别使用Switch和MultiSwitch类来表达开关节点和可细分的多重开关节点
(3)细节层次节点(Level of Detail,LOD)。在不影响渲染外观的前提下,根据实际情况选择一种更为简单的方式来表达要渲染的物体,减轻系统绘制场景的负担。静态离散LOG(预置有限数目个细节层次方案)、连续LOD(Continuous LOD,实时计算和改变对象的表达方案)、混合LOD(对两个表达方案进行线型混合)
(4)相机节点 Carmera
(5)投影节点 Projection
(6)渲染属性节点 光照、雾效果、透明效果、纹理贴图等 StateSet
(7)覆盖节点 OverlayNode
(8)遮挡裁减节点OccluderNode类
(9)动态调度节点 PagedLOD
(10)关节节点osgAnimation库的Bone类和Skeleton类(某个完整形体骨骼结构的根节点)
(11)代理节点 作为另外一种尚未加载的节点的代理者 ProxyNode节点
4.2节点的访问 http://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html
访问器(Visitor,访问者)是一种经典的对象行为模式。 osg::NodeVisitor类
1.节点接受一个访问器,用户执行某个节点的accept()函数,将一个具体的访问器对象传递给节点
2.节点反过来执行访问器的apply()函数,并将自身传入访问器。
void Node::accept(NodeVistor& nv)
{ nv.apply(*this) ; }
3.在具体访问器对象中重写的apply()函数中,执行节点的具体访问操作。
深度优先遍历 P79 自定义访问器
osg的节点主要使用回调(CallBack)来完成用户临时定义的、需要每帧执行的工作。
回调是一种用户编写的功能模块,可以作为一个参数传递给其他功能模块,从而实现对某些底层系统事件的响应和处理。c++使用函数指针,.net托管。
osg节点回调包括更新回调(Update Callback)和人机交互事件回调(Event Callback)。回调类基类osg::NodeCallback P82
http://blog.csdn.net/u011310341/article/details/51209581 人机交互时间回调和时间的区别
4.3重要节点的功能实现 P84