osg 笔记一 (转)
场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率
场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息。根节点和各个组节点都可以有零个(实际上是没有执行任何操作)或多个子成员。在场景图形的最底部,各个叶节点包含了构成场景中物体的实际几何信息。
Osg程序使用组节点来组织和排列场景中的几何体。
场景图形通常包含了多种类型的节点以执行各种各样的用户功能,例如开关节点可以设置其子节点可用或不可用,细节层次节点(LOD)可以根据观察者的距离调用不同的子节点,变换节点可以改变子节点几何体的坐标变换状态。
场景图形特征:
1. 提供底层渲染API中具备的几何信息和状态管理功能之外,还兼备以下的附加特征和功能:
2. 空间结构:
3. 场景拣选,投影面剔除和隐藏面剔除。
4. 细节层次:
5. 透明
6. 状态改动最少化
7. 文件I/O
8. 更多高性能函数:全特征文字支持,渲染特效的支持,渲染优化,3d模型文件读写支持,跨平台输入渲染及显示设备的访问.
场景图形渲染方式:
三种遍历操作
1. 更新
2. 拣选
3. 绘制
Osg设计所采用的设计理念和工具:
Ansi标准C++
C++标准模板库
设计模式
Osg命名习惯:
命名空间:小写字母开头,然后大写字母避免混淆。
类:大写字母开头,每个单词首字母大写。
类方法:小写字母开头,此后每个单词首字母大写。
类成员:同上
模板:小写字母,多个单词之间使用下划线分隔。
静态量:静态量和函数的名称使用s_开头
全局量:用g_开头
组件:
一.Osg核心库:提供了基本的场景图形和渲染功能,以及3d图形程序所需的某些特定功能实现。包括:
1.osg库:包含了用于创建场景图形的场景图形节点类,用作向量和矩阵运算的类,几何体类,以及用于描述和管理渲染状态的类,3d图形程序所需的典型功能类,例如命令行参数解析,动画路径管理,以及错误和警告信息类。
2.osgUtil库:osg工具库包含的类和函数,可以用于场景图形及其内容的操作,场景图形数据统计和优化,以及渲染器的创建。它还包括了几何操作的类,例如delaunay三角面片化,三角面片条带化,纹理坐标生成等。
3.osgDB 库:建立和渲染3d数据库的类和函数:允许用户程序加载,使用和写入3d数据库,它采用插件管理的架构。osgDB维护插件的信息注册表,并负责检查将要 被载入的osg插件接口的合法性。OsgDB::DatabasePager实现应用程序从文件中读取各部分数据库信息时,在不干扰当前渲染的前提下以后 台线程的方式进行。
4.osgViewer库:包含了场景中视口及可视化内容的管理类。定义了一些视口类,可以将osg集成到许多视窗设计工具中,如MFC,win32等。
5.osgGA库:用于改写界面事件。
二.NodeKits:扩展了核心osg场景图形节点类的功能,以提高高级节点类型和渲染特效。包括如下库:扩展了Nodes,Drawables和 StateAttributes。由两部分组成,NodeKit本身,以及针对.osg的封装插件库。有以下的几种NodeKits:
1.osgFX库:提供了额外的场景图形节点,以便于特效的渲染,例如异向光照,凹凸贴图,卡通着色等。
2.osgParticle库:提供了基于例子的渲染特效。如爆炸,火焰,烟雾。
3.osgSim库:提供了仿真系统中以及渲染OpenFlight数据库所需的特殊渲染功能,例如地形高程图,光点节点,DOF变换节点等。
4.osgText库:此类库提供了向场景中添加文字的得力工具,可以完全支持TrueType字体。
5.osgTerrain库:提供了渲染高度场数据的能力。
6.osgShadow库:提供了支持阴影渲染的框架结构。
三.Osg插件:其中包含了2d图像和3d模型文件的读写功能库。
四.互操作库:使得osg易于与其他的开发环境集成。
为了确保osg可以在更多环境中运行,osg提供了一个与语言无关的,可供运行时访问的接口。OsgIntrospection库允许用户软件使用反射式和自省式的编程范式与osg进行交互。
五.不断扩展的程序和实例集:提供了实用的功能函数和正确使用osg的例子。
1.osgarchive:用于向.osga文件包中添加新的文件。也可以用这个程序实现包的分解和列表。
2.osgconv:这个程序用于转换文件格式。它可以将任何文件格式转换为经过优化的.ive格式。
3.osgdem:用于将高程图等高程数据及图像数据转化成分页的地形数据库。
场景图形类:osg库
osg::Node :所有场景图形类均继承自此类。
Node:场景图形中所有节点的基类。包含了用于场景图形遍历,拣选,程序回调,以及状态管理的方法。
Group:所有可分支节点的基类。
Geode:相当于osg中的叶节点(geometry node)。没有子节点,但是包含了osg::Drawable对象,此中存放了将要被渲染的几何体。
LOD:此类根据观察点与图像子节点的距离选择显示子节点。通常使用它来创建场景中物体的多个显示层级。
MatrixTransform:包含了用于实施子节点几何体的空间转换的矩阵,以实现场景对象的旋转,平移,缩放,倾斜和映射等操作。
Switch:用布尔模板来允许或禁止子节点的运作。
其他的如:Sequence,PositionAttitudeTransform等
几何体类:osg库
Geode:osg的叶节点,包含了渲染用的几何数据,使用以下类实现几何数据的存储:
Drawable:用于存储几何数据信息的基类,Geode维护了一个Drawable的列表。纯虚类无法实例化,必须实现派生类,如:Geometry,或者ShapeDrawable(允许用户绘制预定义的几何形状,如球,圆锥,矩形体等)。
Geometry:与PrimitiveSet类相关联,实现了对opengl顶点数组功能的高级封装。保存了顶点数组的数据,纹理坐标,颜色以及法线数组。
PrimitiveSet:提供了opengl顶点数组绘图命令的高层次支持。用户可以从Geometry中获得保存的数据,再使用这个类制定要绘制的几何体数据的类型。
Vector类:支持float和double类型。
Array类:数组类型。
状态管理类:osg库
保存场景所需的opengl渲染状态,
状态集合StateSet:osg在此类中保存一组定义状态数据(模式和属性)。场景图形中的任何一个Node都可与StateSet相关联。
模式:与glEnable和glDisable相类似。用Osg::StateSet::setMode()可在StateSet中保存一个模式信息。
属性:用于制定状态信息,osg::StateSet::setAttribute()在StateSet中保存属性信息。
纹理模式和属性:StateSet类方法的setTextureMode和setTextureAttribute进行设置。
继承标记:用于标志量的操作。用于控制场景图形遍历中的状态值。
osgViewer库包含了以下三个可能用到的视口类:
SimpleViewer:负责管理单一场景中的单一视口。使用SimpleViewer时,应用程序应当创建一个窗口并设置当前的图形上下文。
Viewer:用于管理多个同步摄像机,他们将从多个方向渲染单一的视口。
CompositeViewer:此类支持同一窗口的多个视口,也支持不同场景的多个摄像机。
其他实用类:osg库
涉及到osg的内存引用计数策略。
Referenced:所有场景图形节点和osg的许多其他对象的基类。它实现了一个用于跟踪内存使用情况的引用计数。如果某个继承自Referenced类的对象引用计数数值到达0,那么系统将自动调用其析构函数并清理为此对象分配的内存。
ref_ptr<>:模板类ref_ptr<>为其模板内容定义了一个智能指针。模板内容必须继承自Referenced。
Object:纯虚类,一切需要I/O支持,拷贝和引用计数的对象的基类。
Notify:osg库提供了一系列的控制调试,警告和错误输出的函数。用户可以通过指定一个来自NotifySeverity枚举量的数值,设定输出的信息量。
交运算:osgUtil库
通过提供大量用于场景图形交运算,使用如下类可以获得场景图形中被拾取部分的信息:
Intersector:纯虚类,定义了相交测试的接口。执行相交测试时,应用程序将继承自Intersector的某个类实例化,传递给IntersectionVisitor的实例,并随后请求该实例返回数据以获取交运算的结果。
IntersectionVisitor:IntersectionVisitor搜索场景图形中与指定几何体相交的节点,而最后的测试工作由Intersector继承类完成。
LineSegmentIntersector:继承自Intersector,用于检测指定线段和场景图形之间的相交情况,并向程序提供查询相交测试结果的函数。
PolytopeIntersector:与LineSegmentIntersector类似,该类用于检测由一系列平面构成的多面体的相交情况。当用户点击鼠标,希望拾取到鼠标位置附近的封闭多面体区域时,PolytopeIntersector类尤其有效。
PlaneIntersector:与LineSegmentIntersector类似,用于检测由一系列平面构成的平面的相交情况。
优化:osgUtil库
Optimizer:用于优化场景图形。
Statistics和StatsVisitor:StatsVisitor返回一个场景图形中节点的总数和类型,Statistics返回渲染几何体的总数和类型。
几何体操作:osgUtil库
Simplifier:使用此类用来减少Geometry对象中几何体的数目,这有助于低细节层次的自动生成。
Tessellator:根据一组顶点的列表,生成由前述列表描述的多边形,即一个osg::PrimitiveSet
DelaunayTriangulator:实现了Delaunay三角网格化运算,根据一组顶点的集合生成一系列的三角形。
TriStripVisitor:遍历场景图图形并将多边形图元转化成三角形和四边形条带。
SmoothingVisitor:SmoothingVisitor可生成顶点法线,也就是所有共享此顶点的面的法线平均值。
纹理贴图生成:包含了建立反射贴图,中途向量贴图,高光贴图。
osg 笔记一 (转)的更多相关文章
- 【OSG学习笔记之一:】OSG+VS2010+win7 64位环境搭建
虽然出生的时候,没有说过“Hello World!”,但是自从走上了编程之路,每一次输出“Hello World!”的时候,都觉得好比中了彩票大奖似的: 仔细算算,从2012年暑假到现在,经历了3年半 ...
- osg学习笔记3 简单几何模型
osg::Geode (geometry node) osg::Geode类表示场景中的渲染几何叶节点,它包含了渲染用的几何信息,没有子节点. 要绘制的几何数据保存在osg::Geode管理的一组os ...
- osg学习笔记2, 命令行参数解析器ArgumentParser
ArgumentParser主要负责命令行参数的读取 #include <osgDB/ReadFile> #include <osgViewer/Viewer> int mai ...
- osg(OpenSceneGraph)学习笔记1:智能指针osg::ref_ptr<>
OSG的智能指针,osg::ref_ptr<> osg::Referenced类管理引用计数内存块,osg::ref_ptr需要使用以它为基类的其它类作为模板参数. osg::ref_pt ...
- OSG(OpenSceneGraphcow.osg)配置笔记
OpenSceneGraph是一款高性能的3D图形开发库.广泛应用在可视化仿真.游戏.虚拟现实.高端技术研发以及建模等领域.使用标准的C++和OpenGL编写而成,可以运行在Windows系列.OSX ...
- 【学习笔记】OSG中相机参数的更改
#pragma comment(lib, "osg.lib") #pragma comment(lib, "osgDB.lib") #pragma commen ...
- 【学习笔记】OSG 基本几何图元
例:geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4)); 来指定要利用这些数据生成一个怎么样的形状. ...
- OSG学习笔记0——解决OSG读obj模型问题[转]
原文:https://blog.csdn.net/u011310341/article/details/51179948 #include "stdafx.h" #include& ...
- OpenSceneGraph 笔记--如何导出三角形数据
OpenSceneGraph 笔记--如何导出三角形数据 转载:http://blog.csdn.net/pizi0475/article/details/5384389 在OpenSceneGrap ...
随机推荐
- iOS 获取已连接的wifi信息
转:http://blog.csdn.net/marujunyy/article/details/16843173 首先需要 #import <SystemConfiguration/Cap ...
- IE8按F12不显示开发人员工具窗口
转:http://www.cnblogs.com/micromouse/archive/2010/07/11/1775174.html 网上搜来的,记录一下,免得以后忘了 F12将开发人员工具启动后, ...
- C# chart控件绘制曲线
在.NET中以前经常用GDI去绘制,虽然效果也不错,自从.NET 4.0开始,专门为绘制图表而生的Chart控件出现了,有了它,就可以轻松的绘制你所需要的曲线图.柱状图什么的了. using Syst ...
- 告别where 1=1 最佳方案分享
已经有2年没有用过where 1=1了,没想到换了家公司后,又让我看到了它.在网络上面搜索了一下,发现没有人提供一个比较好的方案来解决这一问题.很多人说可以让数据库的优化机制去处理,但是,我想对于大部 ...
- cocos2d-x 详解之 CCLayer(触摸事件)
CCLayer继承自CCNode,在CCLayer中可以实现单点触摸.多点触摸和重力感应回调3种不同形式的交互.这部分的难点在于,当存在多个层都要去接收触摸时它的响应机制是如何处理的.了解内部的处理机 ...
- CodeForce---Educational Codeforces Round 3 Load Balancing 正题
看到这题是我的想法就是肯定跟平均值有关但是接下来就不知道怎么做了 看完大神的正解数之后,原来发现是这么简单,但是就是不知道为啥一定是平均值和平均值加1,而不是平均值和平均值减1: 好啦下面就贴出大神的 ...
- bzoj 1537 [POI2005]Aut- The Bus(DP+BIT)
[题意] 顺序经过k个点,求获得的最大权值和. [思路] 设f[i]表示到第i个点,则有转移式: f[i]=min{ f[j]+w[i] } x[j]<=x[i],y[j]<=y[i] 满 ...
- linux下无法安装VMware的解决方法
在Reahat下安装VMware-Player-6.0.1-1379776.x86_64.bundle,结果却提示 Extracting VMware Installer...done.NOT_REA ...
- SQL游标遍历数据表
DECLARE @资产编号 VARCHAR(50) ,@gsid VARCHAR(50) DECLARE test_Cursor CURSOR LOCAL FOR SELECT 资产编号,gsid F ...
- 取消本地SVN文件夹与服务器关联
问题:之前建了一个SVN代码库,同步了代码上去,但中途发现建库时的规则搞错了,就把服务器上的库给删了重建,然后改变本地代码的svn服务器关联地址,但使用Relocate一直报错. 错误有两种情况:1. ...