三维渲染引擎设计与实践(一)

一、初始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)开关节点, 分别使用SwitchMultiSwitch类来表达开关节点和可细分的多重开关节点

(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

原文地址:https://www.cnblogs.com/hanmolabi/p/7197721.html