OSG学习笔记

  • 格式:docx
  • 大小:20.54 KB
  • 文档页数:6

OSG学习笔记

Switch(转换)节点用于标记来控制其子节点的显示或隐藏,使用Switch节点可以对其下层子节点进行有选择性的控制。将若干节点放置在Switch 节点下可以使用任意的组合方式来显示指定的节点。

Lod(细节层次)是一组具有不同精细程度的模型。实时系统可以根据视点距离模型的远近自动调用相应的模型。如果视点距离物体较远,则显示比较粗糙的模型(由较少多边形表示)。当视点移向物体时,实时系统将用比较精细的模型(有较多多边形组成)取代它。

缺省条件下。LOD计算视点到物体包络体中心点的距离。如果这样并不符合渲染要求,那么可以指定一个自定义的中心点。

Osg::ref_ptr lod=new osg::LOD;

Lod->setCenterMode(osg::LOd::USER_DEFINED_CENTER);

Lod->setCenter(osg::vec3(100.0f,100.0f,0.0f));

帧动画:在时间轴的每一帧上逐帧绘制不同的内容,使其连续播放。帧动画具有非常大的灵活性。

三维物体的标准变换主要包括:移动、缩放、旋转和投影等!在场景中的三维物体是由许多三角形网格构成的,物体越精细,三角形网格就越多,将这些三角形网格的顶点坐标列出来,就构成了顶点矩阵。虚拟场景中的物体在三维环境中要实现标准变换,需要借助物体本身的顶点矩阵变换来完成。

运动物体物理建模:几何建模只是建立了对象的外观,不能表现对象的行为,而对象的行为能力由是虚拟现实系统的重要特性。因此在几何建模的基础上还需要进行物理建模,物理建模就是在建模时考虑对象的物理属性,通过使用面向对象的方法,把模型视为对象,用对象的成员变量来记录模型的物理特征。我们以运动汽车受外力作用为例,建立相应的物理模型,我们可以增加物体的质量这一物理属性的描述。物体的速度、位置等物理属性在物理仿真中同样具有重要地位。而速度、位置都是矢量,既有大小又有方向,因此不可避免要引入向量运算,基于以上讨论,建立的车辆类不仅可以表示大小、方向还封装了向量的有关运算。

运动中的车辆产生的状态变化有很多类别,根据具体的研究内容而有所不同,其中最基本的状态变化是三维坐标的变化和姿态的变化。以此为例,本三维实时仿真系统。随着时间轴的变化,由于车辆对象模型的位置和姿态信息已经发生了改变,相应的应该更新该对象模型的平移矩阵、旋转矩阵和缩放矩阵,以实现在三维实时仿真平台中德位置和姿态的更新。同时由于该运动车辆的固有特征没有发生变化,因此其模型子节点不需要变化。

在场景编辑中,往往需要拾取场景对象,最简单最常见的做法是利用鼠标选取所要编辑对象,即用户将鼠标移动到场景中所要选取的模型的位置,点击鼠标,此时程序内部将进行运算,将二维的鼠标屏幕坐标位置映射到正确的三维场景图形节点上,并保存节点地址完成拾取操作。

材质,就是在物体表面创造出一种光学效果,让它在着色时展现不同的质地和色彩。在场景中,利用材质来模拟对象表面的反射特性。对象的表面在3ds Max中一般是通过基本材质使用环境光颜色、漫反射颜色、和高光颜色三种颜色来构建的。大多数基本反射材质都能够通过这三种颜色以及控制高光区来创建。

纹理贴图:将2D图像映射到模型的多边形面片上,以产生特殊效果或真实感的技术。一个3D模型仅仅只有几何结构而没有丰富的纹理特征,它就不能将实际对象完全真实地模拟出来。因为它只有这个对象的几何结构。

灯光:是3ds Max中德一种特殊的对象,它本身不能被渲染或着色,但可以影响其它对象的表面和色彩。恰当的灯光照射,可以改变物体的表现力,增加整个场景的真实感。

三维渲染引擎:为实现三维场景图形的结构管理和绘制而提供的一系列的API的集合。

至少包括构建层和交互层两个层次。

osg核心库包括:

osg库:包括构建场景图形的场景图形节点类,用作向量和矩阵运算的类,可绘制体和几何体的类,用于描述和管理渲染状态的类,以及图形程序所需的典型功能类。如,命令行参数解析、简单动画路径以及错误和警告输出等。

osgDB库:包括用于2D和3D文件读写的插件类注册器,以及用于访问和读写这些插件的独特功能类,此外还提供了数据的动态分页调度机制,可支持大规模数据的动态读入和卸载。

osgUtil库:使用工具库,其中包括场景图形数据统计和优化工具、渲染后台工具、场景裁剪工具;以及大量几何操作相关的类,:例如:

osgGA库:提供了各种视景窗口交互事件的管理工具,用于构建一个与平台无关的人机设备抽象层。事件处理器osgGA::GUIEventHandler 在osgGA库中,为窗口系统的GUI事件提供接口。

编写一个事件处理器的主要步骤是:

1)编写一个新类,它继承自osgGA::GUIEventHandler类

2)重载成员函数handle(),在osgGA::GUIEventHandler中,该函数是一个虚函数,通过重载该函数,根据事件的类型可以执行自定义动作。

3)将事件处理器压入处理器列表,

OsgViewer库:视景器工具库,即单个或多个场景观察和管理的整合工具,以及与平台无关的底层图形设备代码;同时还提供了多线程、多CPU、多显示的场景渲染机制。osgViewer::Viewer 为一个单独的场景【SCENE】保存一个单独的view。

OSG中,专门定义OSgParticle来模拟粒子系统的产生过程。

放射极(osgParticle::Emitter)一般由计数器、放置器和发射器组成。

粒子系统(osgParticle::ParticleSystem)由Drawable类继承出来,对粒子的生成、更新、渲染以及销毁进行维护和管理。

粒子(osgParticle::Particle)是组成粒子系统的基本元素,它具有点(POINT)、线(LINE)、四边形(QUAD)、六角形(HEXAGON)等各种形状。 放置器(osgParticle::Placer)是放射极的一部分,主要用于指定粒子的开始位置。

发射器(osgParticle::Shooter)也是放射极的一部分,主要用来设置粒子的初速度。RadialShooter类用来设置粒子的方向。

计数器(osgParticle::counter)与放置器、发射器同样属于放射极,主要对每帧产生的粒子数进行控制。

粒子系统更新器(osgParticle::ParticleSystemUpdater)主要对粒子进行自动更新,它在进行拣选和遍历时对全部存活的粒子更新方法进行调用。

标准编程器(osgParticle::modularProgram)主要对粒子的位置进行控制,并且需要ModularProgram与Operator对象进行组合。

操作器(osgParticle::Operator)主要对粒子生命周期中德运动特性进行控制。

粒子系统的基本思想是:用许多形状简单且赋予生命的微小粒子作为基本元素表示物体。粒子系统把物体定义为许多不规则的、随机分布的粒子,而每个粒子均有一定的生命周期。

雾效与雪效、雨效不一样,它其实并不是一种粒子系统。,只是一种状态属性。因为本身像一种粒子系统,所以可以归纳在粒子系统中。

创建天空盒一般使用的是球体天空盒和方体天空盒。创建球体天空盒主要步骤:

1)创建立方图的纹理对象,读取该立方图的纹理贴图

2)设置自动生成纹理坐标

3)设置纹理矩阵

4)设置立方图纹理

5)设置矩阵变换节点,来实现合适的矩阵变换

6)关闭关照并关闭背面剔除,设置渲染的顺序,加入到节点中进行绘制。

实体对象的拾取、拖动和组合

在对虚拟实体进行控制的时候,先进行拾取,在OSG中实现是通过OSgUti::LineSegmentIntersector函数计算鼠标点击位置是否与场景中节点相交,相交就拾取到场景中物体,然后拖动,拖动是通过ChemDragger:public osgManipulator::Dragger 函数实现的,它是从osgManipulator::Selection *selection 继承过来。

拖动是这样的:首先拾取到物体,将物体的局部坐标系转换为世界坐标系。设置投影平面,然后通过函数osgManiplatir::TranslateInPlaneCommand中德setStage进行控制拖动过程的各个阶段,如:osgManipulator::MotionCommand::START|MOVE|FINISH 各个阶段进行不同的操作。在鼠标拖动过程中就要进行设置setTranslation(),setReferencePoint()的操作。然后通过dispatchCmd()发布命令。它用addSelectionToCommand()进行拖动操作。

osgDB库提供了用户程序读取和写入2D图像和3D模型文件的函数接口。

OSG插件也就是一组动态链接库,其中实现了osgDB头文件Read Writer 定义的接口。为了保证OSG可以找到这些插件,插件所在目录必须在Windows 的PATH环境变量中列出。

读取文件:

使用函数osgDB::readNodeFile()和osgDB::readImageFile()来读取3D模型和2D 图像文件。

Osg:Node *osgDB::readNodeFile( )

Osg:Image *osgDB::readImageFile( )

场景图形树结构的顶部是一个根节点。从根节点向下延伸,各个组节点中均

包含了几何信息和用于控制其外观的渲染状态信息,在场景图形的最底部,各个叶节点包含了构成场景中物体的实际几何信息。

OSG定义的智能指针模板类ref_ptr<>.

osgFX::Scribe用来修饰模型所用,可以把模型的三角片元全部高亮显示。 if (ea.getKey() == 0xFF52 || ea.getKey() == 0x57 || ea.getKey()

== 0x77)

{

ChangePosition(osg::Vec3(0,m_fMoveSpeed * sinf(osg::PI_2

+ m_vRotation._v[2]), 0));

ChangePosition(osg::Vec3(m_fMoveSpeed * cosf(osg::PI_2 +

m_vRotation._v[2]),0,0)); return true;

}

在飞行仿真系统中为了使仿真效果更加逼真、形象,飞机的襟翼、副翼、方向舵、升降舵等部件相对于整个飞机必须是可以运动的。因此在创建飞机模型时,首先需要创建DOF (自由度)节点,然后将需要设置自由度的模型对象设置为DOF节点的子节点,同时创建局部坐标系并设置DOF节点的自由度范围,最终在视景仿真程序中调用该DOF节点,它就可以使其下的模型相对于X Y Z轴做平移或者旋转运动!