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可生成顶点法线,也就是所有共享此顶点的面的法线平均值。

     纹理贴图生成:包含了建立反射贴图,中途向量贴图,高光贴图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7.x 安装 CDH 6.x

前置条件 ntp服务安装防火墙关闭 执行以下优化代码 systemctl stop firewalld.service echo "* soft nofile 128000" >>/etc/security/limits.conf echo "* hard nofile 128000" >>/etc/security/limits.conf echo "* so…

osg学习博客

http://www.cnblogs.com/mazhenyu/p/3522387.html http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html&#xff08;基础知识&#xff09;

Windows IEDA 编译Hbase源码报错 - 无法执行shell脚本

windows 下编译 hbase源码&#xff0c;报错 [ERROR] Command execution failed. java.io.IOException: Cannot run program "bash" (in directory "D:\File\ideaWorkspace\hbase-1.4.10-src\hbase-1.4.10\hbase-shaded\hbase-shaded-check-invariants\target\…

怎样查找自增列主键的id

select max(id) from inform &#xff08;inform为表名,查询最大的id值&#xff09;

c++使用Lua

http://www.jb51.net/article/55096.htm

最新版 VMware 安装,虚拟机安装, Ubuntu可视化linux系统安装

一、下载 地址&#xff1a;https://www.vmware.com/cn.html 二、安装VM 选择相应配置&#xff0c;一直下一步即可 双击打开VMware&#xff0c;输入密钥&#xff1a;CG392-4PX5J-H816Z-HYZNG-PQRG2 Ubuntu 镜像下载地址&#xff1a; https://www.ubuntu.com/download/desktop/…

何为“渲染”

这个问题也曾经困惑过我很久.其实"渲染","绘制","画画"这三个词是一个意思.对应的英文是Render,Draw,Paint.但"渲染"的逼格要高于"绘制","绘制"的逼格要高于"画画".在计算机图形学相关的书中,你只会看到…

java 获取插入数据的自增长id

/*** * 这是插入一条数据的同时&#xff0c;获取该数据的则增长列的值&#xff08;该例子的自增长列是id&#xff09;* * author LZL* */ public class Auto_Increment {private static Connection conn null;private static PreparedStatement stsm null;private static Res…

Flink 集群搭建安装 CentOS 7.x 版本

基本准备&#xff1a; JDK免密登录&#xff08;不设置后期启动可以手动输入密码&#xff09;Centos 7.x 一、下载Flink 下载地址&#xff1a;http://flink.apache.org/downloads.html 我这里使用&#xff1a;https://www.apache.org/dyn/closer.lua/flink/flink-1.9.0/flin…

Mipmap纹理技术简介

在三维世界中,显示一张图的大小与摄象机的位置有关,近的地方,图片实际象素就大一些,远的地方图片实际象素就会小一些,就要进行一些压缩,例如一张64*64的图,在近处,显示出来可能是50*50,在远处可能显示出来是20*20. 如果只限于简单的支掉某些像素,将会使缩小后的图片损失很多细节…

子网掩码、最大主机、最大子网数的计算

前言&#xff1a; 不管是在校招笔试中&#xff0c;还是在软考中&#xff0c;基础知识都是尤为重要的&#xff0c;尤其是计算机网络这块&#xff0c;经常考到这块&#xff0c;所以这里做一个笔记总结一下。下面给出一个具体的案例来分析&#xff1a;题目&#xff1a;1、…

web通讯录之登录注册界面

登录页面&#xff1a; 功能说明&#xff1a;登录页面是在页面模糊背景网站中找的素材加以修改成自己想要的登录界面&#xff0c;我们老师让我们在登录时候加验证码&#xff0c;看了大部分人用的是签名登录方式&#xff0c;觉得没有什么特色因此设计了滑动登录&#xff0c;把验证…

使用IntelliJ IDEA导入 Flink 消费kafka报错 Error: A JNI error has occurred, please check your installation an

提示找不到类&#xff0c;pom中已经引用了jar包&#xff0c;使用eclipse也可以执行&#xff0c;就是IntelliJ不行 java.lang.NoClassDefFoundError: org/apache/flink/api/common/serialization/DeserializationSchemaat java.lang.Class.getDeclaredMethods0(Native Method)a…

有限状态机/FSM

有限状态机&#xff08;FSM&#xff09;的设计与实现&#xff08;一&#xff09; 有限状态机&#xff08;FSM&#xff09;是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型&#xff0c;在计算机领域有着广泛的应用。通常FSM包含几个要素&#xff1a;状态的管理、…

web通讯录之通讯录主界面

界面展示&#xff1a; 界面所用的素材网址点击打开链接&#xff0c;在用网上素材时候首先要把代码看懂才能进行修改&#xff0c;因此希望读者好好看看源码&#xff0c;看的时候着重看看字母排序原理、JQuery设计等等。 分组展示&#xff1a;这个地方有个不好的地方&#xff0c…

NameNode 启动失败 - There appears to be a gap in the edit log. We expected txid xxx, but got tx

场景 NameNode迁移&#xff0c;导致一个节点无法启动 异常 在Namenode主动迁移&#xff0c;或者Namenode机器挂掉无法恢复时&#xff0c;我们需要Namenode节点迁移&#xff0c;迁移经常会出现一个NameNode启动成功&#xff0c;另外一个standby启动失败&#xff0c;报错如下 …

opengl光照

看一张图片&#xff1a; 图中绘制了两个大小相同的白色球体。其中右边的一个是没有使用任何光照效果的&#xff0c;它看起来就像是一个二维的圆盘&#xff0c;没有立体的感觉。左边的一个是使用了简单的光照效果的&#xff0c;我们通过光照的层次&#xff0c;很容易的认为它是一…

Nifi 之 kafka消费存入hbase

添加kafka processor&#xff0c;配置如下 kakfa数据格式为JSON&#xff1a; {"events_tag":"103913","query_word":"华大癌变 虎嗅","time":"2018-08-09 13:01:11"} 添加putHbaseJSON&#xff0c;json格式添加数…

web通讯录之搜索功能

手机号搜索&#xff1a; 姓名搜索&#xff1a; 拼音搜索&#xff1a; 城市搜索&#xff1a; 性别搜索&#xff1a; 点击姓名或者电话显示完整信息 相信大家期待自己所写的搜索功能类似于百度、谷歌这种搜索引擎&#xff0c;有兴趣的读者可以去学学SEO&#xff0c;在这里我…

opengl多重纹理映射

关于多重纹理:首先如果一个显卡支持多重纹理,表示它可以将几次渲染合为一次来进行,在这个渲染过程中,你可以在不同的纹理单元分别放入第0次,第1次,第2次需要渲染的对象.当程序向屏幕绘图时,将这些渲染结果叠加起来,将最终结果显示到屏幕.每个纹理单元对应有其纹理环境,这个纹理…