基于OSG的粒子系统仿真实现

2017-05-30 23:39张慧
科技风 2017年17期
关键词:粒子系统

摘 要:OSG就是一款高效实时的三维图形开发包,它构建于OpenGL图形函数库之上,全部采用标准C++语言开发, OSG图形系统[1]主要应用于游戏、虚拟现实和科学计算可视化与仿真领域中的高性能图形程序的开发。在构建虚拟场景后,为了增加虚拟场景的真实度,加入自然现象能使场景更加的逼真,而在OSG中给我们提供了粒子系统能很好的完成这部分设计,本文着重讨论基于粒子系统仿真的雪效和雨效,实践证明OSG的粒子系统能满足仿真的要求。

关键词:OSG;粒子系统;雪效

1 粒子系统简介

1.1 粒子系统概念

粒子系统(particlesystem)是迄今为止被认为模拟不规则模糊物体最为成功的一种图形生成算法[2]。它构建场景的方法与以往不同,传统的方法是通过绘制和造型系统的算法来实现,而粒子系统采用的是计算模型,动态的表示物体的运动。因此,粒子系统采用微小粒子图元作为基本单位,这些粒子图元具有颜色、透明度、大小形状及生命周期等属性,粒子的生命周期分为产生到活动到消亡几个阶段,因此,在粒子系统创建过程中,考虑的因素要包括真实的物理模型,还要考虑粒子的各项属性规定[34],在建立好的场景当中也要考虑动力学规律对粒子的影响。

1.2 OSG粒子系统数学模型

在OSG环境中,粒子系统产生的新生粒子位于屏幕上方的圆形区域内。对于每个粒子而言,在粒子出生时就会有不用的随机参数,但实际上每个粒子的真实意义在于其每帧的位置和速度。

在粒子运动过程中要受到很多外界因素的影响,比如重力、风力和空氣阻力等,按照物体的运动规律,设V0为粒子初始速度,S0为粒子的初始位置,粒子的速度V、位置S和加速度a有一下关系:

1.3 OSG粒子系统的工作过程

在OSG中,osgParticle类是专门定义用来模拟粒子系统的,它不但能高效地模拟粒子系统,而且效果生成得非常逼真。

在OSG中使用粒子系统,首先要确定意图。

其次,建立粒子模板,这一步要确定粒子的形状,如点(POINT)、线(LINE)、四边形(QUAD)、六角形(HEXAGON)等,确定粒子的生命周期,以及粒子的角度等因素。

然后要建立粒子系统,设置粒子的相关属性。包括粒子的大小(SIZE)、颜色(COLOR)和Alpha值。每组属性都可以设置它的最大值和最小值,我们通过改变这些最大和最小值,对单个粒子的渲染进行控制,也可以在这两者之间进行线性插值,这样就有利于管理粒子的生命周期。

接下来设置发射器,主要用来设置粒子的初速度、发射器形状及发射粒子的数目变化等。

另外要设置操作,用户可以通过对其中的各种Operator类进行参数设定,如AngularAccelOperator(角加速度)等,改变它们的实例参数。

最后在场景中加载粒子系统,更新粒子状态。

2 基于OSG粒子系统的雨雪模拟实现

2.1 粒子系统场景加载渲染技术

osgViewer库可以很好的进行渲染操作,此在库中定义了一些视口类,因而可以将OSG 集成到许多视窗设计工具中,包括AGL/CGL,FLTK,Fox,FC,Qt,SDL,Win32,WxWindows,以及X11。这些视口类支持单窗口/单视口的程序,也支持使用多个视口和渲染器面的多线程程序。每个视口类都可以提供对摄像机运动,事件处理,以及osgDB::DatabasePager 的支持。osgViewer 库包含了以下三个可能用到的视口类。

(1) SimpleViewer:SimpleViewer 类负责管理单一场景图形中的单一视口。使用SimpleViewer 时,应用程序必须创建一个窗口并设置当前的图形上下文(graphics context)。

(2)Viewer:Viewer 类用于管理多个同步摄像机,他们将从多个方向渲染单一的视口。根据底层图形系统的能力,Viewer 可以创建一个或多个自己的窗口以及图形上下文,因此使用单一视口的程序也可以在单显示或者多显示的系统上运行。

(3)CompositeViewer:CompositeViewer 类支持同一场景的多个视口,也支持不同场景的多个摄像机。如果指定各个视口的渲染顺序,用户就可以将某一次渲染的结果传递给别的视口。CompositeViewer 可以用来创建抬头数字显示(HUD),预渲染纹理(prerender textures),也可以用于在单一视口中显示多个视图。

通过在控制台窗口中设置osgViewer的命令行参数、键盘和鼠标指令信息、环境变量参数等,即可实现本系统的实时交互功能.

在osg编程中,实现文件读取的模块主要是osgDB工具库[6]。可读写的文件包括模型、视频、图像以及文档等。模型数据可以用节点类(Node)来表达,在本场景中已经建立好了一个ziran.ive模型,为了将此模型文件读入场景图供OSG进行渲染,可以使用如下语句:

osg::Node*node=osgDB::readNodeFile(“ziran.ive”):

2.2 雪效仿真实现过程

采用预定义粒子系统,可以试用osgParticle类,直接加载到场景中使用,在这个场景中采用osgParticle::Precipitation这个新类来实现雨雪的效果。

通过osgParticle确立粒子模板,设置粒子的基本属性,包括粒子的大小,生命周期和变化范围等,雪从天而降,一直到后期的消失要经历一个生命周期,尺寸决定了粒子大小,透明度变化范围(AlphaRange)和颜色变化范围(ColorRange)———透明度指光线穿透介质的程度.粒子的透明度和颜色随着时间变化在设定范围内发生变化。通过osgParticle:: ParticleSystem生成粒子系统实例,利用函数setDefaultAttibutes生成粒子的材质(Texturefile),本场景采用贴图进行渲染,质量和粒子半径决定了粒子的物理属性,粒子参数设置表如下 :

同时定义一个发射器,模拟发射器由osgParticle::ModularEmitter创建。在本场景中由于雪是从天空向下飘,所以放置器的角度是在场景的一定高度,扇面放置器(SectorPlacer)所有粒子由设定中心(Center)、角度范围(PhiRange)、半径范围(RadiusRange)的扇面产生发射一个的范围,发射器发射速度不易太快在添加雪效是设置为(50,200),在添加雨效时,速度要适当改变,每秒钟粒子添加粒子个数范围为线性插值介于最大值maxvalue和最小值minvalue之间,在本场景中设置为(100,300)。粒子在下落过程中会收到重力加速度影响,重力加速度对粒子的生命周期影响意义重大,可增加粒子效果的真实感,在本例中使用重力加速度默认为0.80665f。定義发射器参数设置如下表2:以上是设置好的粒子系统的各项参数,把设置好的粒子系统添加到粒子更新器中,并且要添加到建立好的模型场景中,通过2.1粒子系统场景加载渲染技术,把场景加入根节点进行渲染,得到真实的雪效,虽然自定义的粒子系统编程较复杂,但是效果也很逼真。同样的方法可以实现雨效,只需要改变相关参数,发射器的发射速度值和雨的浓度同样可以仿真现实中的雨效。

3 实验结果

本文是在CPU为Inter(R)Pentium(R) Dual Core E5500 1.80 GHz、内存为DDR2G、显卡为英特尔 GMA 4500(M)(HD)集成显卡配置的PC机上进行运行模拟的。显示器的垂直刷新率为60Hz,可以保证渲染图像显示跟屏幕更新保持同步。仿真效果图1雪效,图2雨效。

4 小结

利用软件开发环境完成基于粒子系统搭建与仿真,OSG粒子系统可以很好的模仿现实自然想象,OSG中自定义粒子系统各项参数的不同设定能得到不同状态下的雨雪效果,实验结果表明利用粒子系统可以很好地实现场景粒子特效,增强了虚拟现实逼真度,并具有很高的实时性。

参考文献:

[1]Martz P.Open scene graph quick start guide [M/OL].NewYork:Skew Matrix Software LLC,2007.

[2]王乘,李利军,周均清.Vega实时三维视景仿真技术[M].武汉:华中科技大学出版社,2005:83218.

[3]杨述华,廖守亿,王仕成,等.基于粒子系统和 Vega的实时雨雪模拟[J].计算机应用,2008,28(6):238 240.

[4]刘巧红,单贵.粒子系统在虚拟校园中的应用研究.计算机技术与发展,21(2).

[5]施润尼徐波编程指南北京:机械工业出版社,2008,08.

[6]张小辉.虚拟交通场景中的雨雪仿真[D].西南交通大学硕士论文,2010:3537.

作者简介:张慧(1980),女,河南登封人,中山大学工程硕士,现在在广东财经大学三水校区技术中心分中心工作。

猜你喜欢
粒子系统
利用GPU加速的粒子系统全球流场可视化系统设计与实现
基于OpenGL 的视频特效粒子系统在MAYA 中的实现
基于OpenGL的粒子系统的喷泉模拟
UE 4粒子系统与外部数据通信研究
基于Unity3D的水波涟漪仿真模拟
基于Unity3D粒子系统的消防水枪流体喷射仿真研究
基于OpenGL喷泉粒子系统设计与实现
基于粒子系统的交互式叶脉生成
粒子系统在航海应用上的展望*
基于粒子系统的建模与仿真综述