基于粒子系统的三维降雪场景仿真

2017-02-22 07:06汪继文
计算机技术与发展 2017年1期
关键词:降雪雪景纹理

周 强,汪继文

(安徽大学 计算机科学与技术学院,安徽 合肥 230039)

基于粒子系统的三维降雪场景仿真

周 强,汪继文

(安徽大学 计算机科学与技术学院,安徽 合肥 230039)

通过研究粒子系统方法,结合面向对象的C++语言,建立粒子系统的过程模型,分析实际降雪物理运动过程,建立雪粒子系统三维模型,简化雪花下降过程中的运动模型,省去对速度的实时每帧控制。通过控制雪粒子位移来模拟受风力影响的实际宏观降雪雪景,同时通过参数控制实现风力强弱的影响效果和大雪小雪的景观控制,并在笛卡尔三维坐标系的z轴上引入指数函数F=ex作为控制因子,使雪粒子满足近大远小的透视投影视点效果,具有三维景观效果,并结合OpenGL图形接口对降雪场景进行渲染。实验结果表明,该方法具有逼真的三维仿真效果且代码具有良好的可扩展性。

粒子系统;雪景模拟;OpenGL;纹理映射

1 概 述

随着现代社会的发展,人们对虚拟现实的需求越来越大,在计算机游戏、动画以及影视广告中都有着广泛的应用需求。而自然景物诸如海浪、云、烟、火焰、雨、雪的虚拟模拟,因其运动的不规则性和动态性,成为计算机图形模拟中的难点问题。

粒子系统(particle system)作为模拟不规则物体最成功的算法之一,被研究应用至今。自Reeves W T[1-2]于1983年首次提出粒子系统,并成功模拟了火焰、爆炸等效果以来,国内外专家已经用粒子系统方法的思想成功模拟出了许多自然景物,并不断对模拟进行改进,以追求更高的真实性和实时性。Coutinho等[3]在他们的研究中用粒子系统方法生成雨滴。Latta L等[4]采用GPU进行粒子系统模拟,能实时处理超过100万个粒子,使得大规模粒子模拟变成了可能,也使越来越多的人开始关注并研究基于GPU的粒子系统动画模拟。国内的袁霞和张玉啄[5]对粒子系统的方法及应用作了较为详尽、系统的阐述。金小进等[6]利用粒子系统模拟了火焰,并在渲染过程中分别从实时性和真实感两方面对粒子系统进行了优化。汪继文等[7]利用粒子系统进行了烟花仿真,并实现了对烟花形状的控制。潘秋羽等[8]提出了基于粒子系统的快速的云三维仿真算法,能快速地产生形状各异的真实感较强的三维云。何亮等[9]基于粒子系统模拟了动态雪景,但是所建物理模型较简单并没有考虑环境因素。徐利明等[10]提出了一种在大型场景漫游系统中实时模拟雨、雪的方法。单在雪粒子的模拟中,对粒子系统的方法就有不同的研究方向。刘金瑄等[11]基于粒子系统和XNA平台工作原理,利用C#语言在XNA平台下对飘雪进行了仿真。许金生和宋万忠[12]基于OpenGL的OSG图形库对雪景进行模拟,真实地分析了雪粒子的受力情况。刘小玲等[13]则利用GPU的高速运算性能模拟了大规模的雨雪场景。除此之外,也有学者基于Vega(MultiGen-Paradigm公司工业软件)对雪粒子系统进行模拟,杨述华等[14]基于粒子系统和Vega对雨雪进行了模拟。

综上,基于粒子系统的模拟要建立合适的物理模型且尽可能满足模拟的真实性,同时也需要对粒子更新的过程尽可能优化使得程序满足实时性要求。文中在分析研究粒子系统的方法的基础上,利用VS开发工具在Windows平台下进行降雪雪景模拟,建立出粒子系统和雪花系统模型,对雪花的运动进行简化,优化模拟过程,模拟出受风力影响的实际降雪雪景,并能实现对风力大小和大小雪的景观控制,引入初等函数F=ex作为控制因子控制粒子大小使得雪粒子具有近大远小的透视投影的三维效果,最后利用OpenGL渲染[15]模拟出降雪雪景。

2 粒子系统的基本原理

ReevesWT于1983年首次提出粒子系统,并成功模拟了火焰、爆炸等效果。其基本思想是用许多基本形状的微小图元粒子来描述不规则的模糊物体,这些微小粒子具有形状、大小、颜色、位置、速度矢量、生命周期等属性,对这些属性进行初始化并施加控制函数进行动态改变,体现出被模拟物体的运动的动态性。同时,为了体现出不规则模糊物体运动的随机性,对相关的粒子属性设置随机控制。所有的粒子都经过产生—活动—消亡这样的过程。鉴于粒子系统这样的特性,它能很好地模拟海浪、云、烟、火焰、雨、雪等这样随机运动的模糊自然景物。

粒子系统实现的基本步骤大致如下:

(1)产生新粒子;

(2)对新粒子属性进行初始化;

(3)更新粒子属性;

(4)删除已经超过其生命周期的粒子;

(5)渲染绘制粒子。

根据粒子系统的算法思想,可以模拟降雪的雪景。每一片雪花作为单个粒子,赋予其相关属性,定义好其数据结构,并根据粒子系统原理的实现步骤架构出粒子系统的过程函数。

利用C++语言编写过程函数,结合OpenGL图形接口对雪花进行渲染。

3 雪粒子系统模型

基于粒子系统算法的基本理论及其过程性,用C++语言可以编写出粒子系统的类,并编写出粒子系统类的过程方法,如InitializeSystem()初始化函数、Update()粒子运动更新函数、Render()粒子渲染函数、Emit()粒子发射函数,再添加一些粒子数、时间等这样的成员变量。用面向对象的思想去处理的好处有很多,在具体模拟不同物体的时候,只要继承粒子系统抽象类,根据模拟物体的具体情况去覆盖父类的虚函数即可,具有良好的扩展性。粒子一般都具有形状、大小、颜色、位置、速度矢量、生命周期这样的属性,用这样一些基本类型的数据去描述定义粒子的数据结构,根据所要模拟的物体不同,需要不同的属性描述。

3.1 雪粒子属性

首先分析雪粒子的运动过程,确定雪粒子的属性。雪花在下落过程中,受重力、空气浮力以及风力的影响,从视觉上呈现出左右飘动徐徐下落的状态。雪花在下落过程中,受外力影响,加速度和速度都发生了变化,导致位移也发生变化。在进行三维模拟时,将三维坐标投影到二维表面(电脑屏幕),在二维平面建立三维笛卡尔坐标系,二维平面具有x,y,z三分量。在x轴上雪花受到风力影响位置左右飘动,在y轴上雪花受到重力和空气浮力影响做下降运动,在z轴上雪花有深浅之分,表示离视点的远近,在这种透视投影中,远处的物体看上去比近处的物体更小一些,所以在z轴上的粒子深浅程度影响雪粒子的大小属性。当飘落到地面后,雪粒子融化消失,粒子死亡被删除。

综上,雪粒子的大体结构为:

structparticle_t

{

vector3_tp_pos; //粒子当前位置

vector3_tp_prevPos;//粒子的上一帧位置

vector3_tp_velocity;//粒子的速度矢量

vector3_tp_acceleration;//粒子的加速度

floatp_life;//粒子的生命周期

floatp_size;//粒子大小

floatp_sizeDelta;//随时间的粒子大小改变量

};

其中定义三维矢量的数据类型vector3_t,包含x,y,z三坐标轴分量参数。

3.2 雪粒子系统模型初始化

雪粒子系统模型构建好后,就可以编写雪景系统类了。雪景类继承粒子系统抽象父类,并对粒子系统类的虚函数如Update()和Render()进行覆盖,根据具体降雪过程来实现粒子系统各个过程函数。

雪花从空中飘向地面,粒子源定义在整个输出窗口上部,其y值高度是固定的,为窗口高度m_height,在x轴和表示离视点远近的z轴上初始粒子位置则是随机的,用随机函数控制。第i个粒子的初始位置公式描述如下:

ParticleList[i].pos.y=m_height

ParticleList[i].pos.x=m_origin.x+FRAND*m_width

ParticleList[i].pos.z=m_origin.z+FRAND*m_depth

其中,FRAND定义为(((float)rand()-(float)rand())/RAND_MAX),是一个(-1,1)之间的随机数。m_origin.x和m_origin.y是坐标轴原点分量,m_width表示窗口宽度,m_depth则是z轴上的深浅值。

初始粒子的大小是固定的,可以设为固定值。同时对雪粒子的初始运动速度状态进行设置。在这里,为了简化之后的雪粒子更新步骤,提高系统的实时性,对每个雪粒子的初始加速度添加一个随机控制函数,使得每个粒子的初始速度状态不一致,而这个速度状态在之后的每一帧更新中不再改变。虽然是匀速状态,但是通过大量速度状态不一致的雪粒子,同样可以营造出雪花左右飘动徐徐下落的视觉效果。这样,在传统的雪粒子模拟中,需要在每一帧中更新的速度和位移信息,只需要更新位移属性即可,而且这样的简化并不影响模拟的真实性,并且提高了系统的实时性,提升了程序效率。在x轴上的初始加速度表示雪粒子受风力影响速度的改变,通过随机函数控制,不同的雪粒子在该轴上的加速度不同,通过粒子相互间速度的不同表明所受风力场的变化,同理,在y轴上加速度的不同表明所受重力和浮力的变化,z轴上加速度的不同表明不同雪花飘离视点的远近。虽然在每一帧更新中速度将不再变化,但是通过整体大量的粒子与粒子之间的速度差异模拟表现出所受外力场的随机变化。第i个粒子的初始速度描述公式如下:

ParticleList[i].m_velocity.x=SNOW_VELOCITY.x+FRAND*V_VARIATION.x

ParticleList[i].m_velocity.y=SNOW_VELOCITY.y+FRAND*V_VARIATION.y

ParticleList[i].m_velocity.z=SNOW_VELOCITY.z+FRAND*V_VARIATION.z

其中,SNOW_VELOCITY是雪粒子的初速度,是一个定义好的三维常矢量,初始速度简化为自由落体,即z轴和x轴初始速度为0,只有竖直下落的y轴初速度。V_VARIATION也是定义好的初始加速度三维常矢量。在x轴上加速度受风力影响随机改变,通过对它参数绝对值的大小进行设置可以表示风力强弱,通过对正负的方向设置可以表示所受风力方向。通过对z轴上的加速度随机变化表示随时间的推移离视点的远近,从而影响粒子的大小,达到近大远小的透视投影三维效果。

粒子的初始属性设置完毕,雪粒子从窗口上部产生。由Emit()粒子发射函数产生,只要粒子数小于程序定义的最大粒子数,就不断循环粒子初始化函数产生粒子。这里对最大粒子数也进行可控设置,从而根据需要可以模拟大雪还是小雪的降雪场景。

3.3 雪粒子运动更新

粒子初始化后,就是粒子的运动更新了。对每个雪粒子个体来说其下降过程中速度将不再改变,但每个雪粒子速度状态不尽相同,通过雪粒子个体间的随机状态差异模拟出实际降雪的随机运动状态效果。通过对运动模型的简化,从而在Update()中省去了对速度的实时每帧控制,提高了系统的实时性,提升了程序效率,优化了模拟。位置的每帧数学模型公式为:

S=S0+∫vdt

第i个粒子的位置描述公式如下:

ParticleList[i].pos=ParticleList[i].pos+ParticleList[i].velocity*Time

在z轴上引入指数函数F=ex作为控制因子,F=ex在(-∞,+∞)上单调递增且在原点的函数值为1,其值域恒大于0。指数函数的数学模型特征可用来粗略控制随时间推移雪粒子离视点的近大远小变化,从而模拟出降雪的三维效果。第i个雪粒子的大小描述公式为:

f=Particle[i].pos.z

Particle[i].size=ef*Particle[i].size

当z值改变到超过一个定值范围时,即表明该粒子离视点过远或者过近,将不在显示它。而当y轴的值下降到一个定值(即程序中设定的地面y值)时,表明雪花降落到地面,删除释放雪粒子,并产生新雪粒子发射。

这样雪粒子系统对粒子系统函数Update()进行了覆盖。

3.4 雪粒子的渲染

如果要使所模拟的物体更加逼真,一般采用纹理贴图的方式。OpenGL的纹理映射(Texture Mapping)功能支持将一些像素数据经过变换(不规则变化也支持)将其附着到多边形表面,使得模拟更加逼真。比如将真实的地板图像纹理映射到矩形上,就可以逼真地模拟出地面效果,而且在变换多边形时,多边形上的纹理图案也随之变化,也匹配透视投影的近大远小效果。OpenGL作为目前主流的图形API之一,与C语言结合紧密,并且有强大的可移植性和渲染效果,提供了强大的库函数进行调用,支持一维纹理、二维纹理和三维纹理。文中启用二维纹理将雪花纹理映射到雪粒子上对雪粒子进行渲染。

纹理映射的基本操作步骤如下:

(1)图像准备:既可以在程序中生成图像,也可以读取图像文件。

(2)生成纹理号:适用于多个纹理反复切换时,一个纹理时不需要。

(3)设置当前纹理:切换纹理,也称为纹理绑定。

(4)定义纹理:指定当前纹理的图像。

(5)设置纹理参数:指定纹理的重叠方式和插值方式。

(6)设置纹理环境参数:决定怎样使用纹理颜色,例如是否与光照色合成。

(7)启动纹理功能,绘制场景,给出顶点的纹理坐标和几何坐标(纹理坐标可以直接参数指定,也可启用自动计算纹理坐标功能)。

(8)退出前删除纹理。

文中采用32×32的bmp格式雪粒子纹理图片,如图1所示。

图1 雪粒子纹理

通过调用Bitmap类中LoadBitmapFileWithAlpha()函数读取图像,并将其初始化渲染到雪粒子上。

4 实验结果

实验硬件环境为主频为3.20 GHz的i5CPU,内存4 GB,显卡为ATI Radeon HD 5450的PC机,选择VS开发工具在Windows平台下,利用OpenGL图形库进行模拟。参数如表1所示。

表1 参数设置

通过表1的参数设置进行模拟,分别得到图2、图3两种视觉模拟效果。图2为受东风影响的大雪降雪雪景,图3为无风的小雪降雪雪景,均满足视觉效果,可按照参数设置自行选择所需模拟的降雪场景。

5 结束语

根据粒子系统的算法思想,结合面向对象的C++语言,建立出粒子系统的过程模型,分析了降雪过程,建立了雪粒子系统的三维模型,在简化雪花下降过程中的运动模型的情况下,通过控制雪粒子位移来模拟实际降雪雪景,简化了粒子更新控制步骤,并在z轴上引入控制因子控制雪粒子大小满足近大远小的透视投影效果,结合OpenGL图形接口成功渲染出了3D降雪场景。同时,对大小雪以及风力强弱实行了参数可控,可以根据需要模拟不同的降雪场景,实验结果也表明其具有逼真的三维仿真效果。

图2 大雪有风实验效果图

图3 小雪无风实验效果图

文中代码具有良好的可扩展性,在此基础上,可以将其应用于各种其他不规则物体(如烟花、雨水等)的模拟。模拟场景也可更加丰富多元化,同时考虑更加复杂的天气情况。

[1]ReevesWT.Particlesystems-atechniqueformodelingaclassoffuzzyobjects[J].ACMSIGGRAPHComputerGraphics,1983,17(3):359-375.

[2]ReevesWT,BlauR.Approximateandprobabilisticalgorithmsforshadingandrenderingstructuredparticlesystems[J].ACMSIGGRAPHComputerGraphics,1985,19(3):313-322.

[3]CoutinhoBB,OliveiraAAF,AtencioYP,etal.RainsceneanimationthroughparticlesystemsandsurfaceflowsimulationbySPH[C]//SIBGRAPIconferenceongraphics,patternsandimages.[s.l.]:IEEEComputerSociety,2010:255-262.

[4]KolbA,LattaL,Rezk-SalamaC.Hardware-basedsimulation

andcollisiondetectionforlargeparticlesystems[C]//ProceedingsoftheACMSIGGRAPH/EUROGRAPHICSconferenceongraphicshardware.[s.l.]:ACM,2004:123-131.

[5] 袁 霞,张玉啄.粒子系统方法及其应用[J].云南师范大学学报:自然科学版,2003,23(3):14-16.

[6] 金小进,马尧海.基于粒子系统的火焰模拟与优化[J].计算机工程与设计,2010,31(5):1118-1120.

[7] 汪继文,胡文平,金余峰.基于粒子系统的8字动态烟花仿真[J].计算机仿真,2010,27(10):211-214.

[8] 潘秋羽,毕硕本,陆良虎,等.基于粒子系统三维动态云的快速仿真算法[J].系统仿真学报,2014,26(1):85-89.

[9] 何 亮,巴力登.基于粒子系统的动态雪景模拟[J].西北大学学报:自然科学版,2010,40(4):603-606.

[10] 徐利明,姜昱明.基于粒子系统与OpenGL的实时雨雪模拟[J].计算机仿真,2005,22(7):242-245.

[11] 刘金瑄,吴频频.XNA环境下粒子系统的飘雪仿真[J].西安科技大学学报,2013,33(4):436-443.

[12] 许金生,宋万忠.基于OSG粒子系统的雪景模拟[J].计算机工程与设计,2012,33(4):1509-1513.

[13] 刘小玲,杨红雨,郭虎奇.基于GPU粒子系统的大规模雨雪场景实时模拟[J].计算机工程与设计,2012,33(6):2398-2401.

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

[15]WrightRS,HaemelN,SellersG,etal.OpenGL超级宝典[M].第5版.北京:人民邮电出版社,2012:208-229.

Three-dimensional Simulation of Snowing Based on Particle System

ZHOU Qiang,WANG Ji-wen

(College of Computer Science and Technology,Anhui University,Hefei 230039,China)

A falling snow algorithmic structure is proposed based on particle system,incorporating the object-oriented C++ language.A 3D model of particle system is built by analyzing the falling process of snow,simplified the motion model of the snowflakes falling process and saved each frame of real-time control for speed.The realistic snowing is simulated which affected by wind through controlling the particles displacement.And on thezaxisofthree-dimensionalCartesiancoordinatesystem,theindexfunctionF=exisintroducedasthecontrollingfactorsothatthesimulationmatchestheperspectiveeffectofperspectiveprojection.ThesimulationiscombinedwithOpenGLgraphicinterface.Theexperimentalresultsshowthatthismethodhasarealistic3Dsimulationeffectandthecodesenableagoodscalability.

particle system;snowscape simulation;OpenGL;texture mapping

2016-03-07

2016-06-15

时间:2017-01-04

安徽省省级重点自然科学研究项目(KJ2013A009)

周 强(1991-),男,硕士研究生,研究方向为计算机仿真、图形图像处理;汪继文,博士,教授,博士研究生导师,研究方向为计算流体力学、计算机仿真、图像处理、智能算法等。

http://www.cnki.net/kcms/detail/61.1450.TP.20170104.1028.046.html

TP

A

1673-629X(2017)01-0130-04

10.3969/j.issn.1673-629X.2017.01.029

猜你喜欢
降雪雪景纹理
1970年~2018年根河市降雪时间变化特征
折多山雪景
《大坂山雪景》《高原平湖》
基于BM3D的复杂纹理区域图像去噪
2003-2017年阳泉市降雪变化及成因分析
使用纹理叠加添加艺术画特效
TEXTURE ON TEXTURE质地上的纹理
特发性腹痛一例
消除凹凸纹理有妙招!
雪夜遇熊