利用计算机来模拟自然景物,一直是计算机图形学领域中很令人感兴趣的话题之一。而粒子系统正是一种描绘自然景物的强有力的工具。雪花由于具有一类自然景物的共性,使得其可以很方便地由粒子系统描述并绘制出来。
我们知道,在计算机视频游戏开发等实际应用领域中,对绘制速度的要求远大于对绘制景物的真实程度的要求,即不需要追求完美的逼真度,但必须保证一定的FPS(即Frames Per Second,每秒钟能够渲染的帧数)。
我利用动力学代数方程建立了风场的速度场模型,以及相应的粒子运动模型,并对传统的粒子系统的绘制步骤进行了两点改进,最后利用微软的DirectX平台编写了演示程序,在保证一定真实程度的前提下,完全达到了实时性的要求。
1 物理场建模及粒子运动模型
自然界中的风场是一个很复杂的场,如果利用空气动力学对其进行建模,势必会在粒子系统更新粒子属性时进行大量的运算,从而在很大程度上拖慢绘制速度。本文提出的风场模型则具有模型简单、逼真度高、计算量小的优点。
1.1 风场的速度场建模
根据气体分子运动理论,空气是一种完全气体。所以我们可以把单位体积的空气看作刚性微粒,在有风的条件下,其具有一定的质量和运动速度。
设风速矢量为Vw,则Vw可以表示为:Vw = Vw1 + Vw2,
其中Vw1 表示平均风速矢量,Vw2表示随机风速矢量。
建立右手直角坐标系xyz,其中y坐标表示垂直高度。
由于在低空中风速受垂直坐标的影响不大,故|Vw|=f(x,z,t)。为了模拟出|Vw|随坐标位置及时间的变化,我们首先令g(t)是由三角函数集构成的周期函数,将其展开为有限项傅里叶级数,可得:
当取a0=0、N=2、3、5,w=1时,g(t)的函数图像就可以呈现出很好的随机感(见图1):
图1 g(t)函数图
然后我们令h(x,z)= Ksin(ax)sin(bz), 其中a,b,K为比例系数。当取K=1、a=0.1、b=0.1时,h(x,z)的函数图像如图2所示:
图2 h(x,z)函数图
所以|Vw|可描述为:|Vw|=|Vw1|+Ksin(ax)sin(bz)g(t)。
设风粒子运动方向与x轴夹角为 ,则
其中ax、az分别为x、z方向的单位矢量。
1.2 重力场及空气阻力场建模
重力场和空气阻力场的物理建模很简单,设a为空气粒子的加速度矢量,则
其中g为重力加速度矢量,f为阻力系数,为一正数。
1.3 粒子运动模型
由前述可知,我们可以把单位体积的空气看作刚性微粒,同时雪花也可以看作是刚性粒子,设其质量为M。由于空气没有具体形状,可以取与雪花同样形状和体积的一部分空气,令其质量为βM(0<β<1)。这样空气粒子与雪花粒子的碰撞可视为完全弹性碰撞,可利用动力学的知识列方程组如下:
其中V1为碰撞前空气粒子的速度矢量,V2为碰撞前雪花粒子的速度矢量,V1'为碰撞后空气粒子的速度矢量,V2'为碰撞后雪花粒子的速度质量。由上述方程组,我们可以解得:
2 DirectX平台下粒子系统的实现
2.1 DirectX平台简介
DirectX是微软公司推出的API,可让以Windows、Windows Mobile/CE以及XBOX/XBOX360为平台的游戏或多媒体程序获得更高的执行效率,加强3D图形和声音效果,并为设计人员提供一个共同的硬件驱动标准。
2.2 粒子系统基本原理
粒子系统的组成元素,自然就是粒子。粒子系统就是指将许多形状简单的微小粒子作为基本元素,然后聚集起来形成一个不规则的模糊物体,从而构成的一个封闭的系统。每个粒子要保存自身的属性并在每帧当中动态更新。一个粒子具有的特征主要包括质量、位置、速度、受力、生存期,以及颜色、空间尺寸、形状等。每个粒子都代表了自然场景中的一个最小单元,通过很多个粒子相互组合,效果叠加,粒子系统才能够显示五彩斑斓的美丽的自然场景。在本文中,雪粒子具有五种属性,即位置矢量、质量、速度矢量、加速度矢量和纹理ID。
2.3 粒子系统的绘制过程
粒子系统绘制过程的伪代码描述如下:
Initialization of Particle System:
{
Initialize Wind //初始化风场
Initialize CSnow //初始化雪花粒子
}
Update Procedure:
{
Calculate FPS and set amount //计算FPS并根据FPS设定粒子数目
Update snow particles //更新雪花粒子的动态属性
Deal with the boundary conditions //处理边界条件
}
Render Procedure:
{
Set world matrix //设置世界矩阵
Set render state //设置渲染状态
Render snow particles //渲染雪花粒子
}
2.4 粒子系统绘制过程中的优化
首先,当粒子到达边界时,直接将该粒子置为初始状态,即将其速度设为零值、位置设为起始点,这样就避免了对内存的不停操作,从而提高程序的运行效率。
其次,我们采用根据FPS动态调整粒子数目的方法,即当粒子数目过多而导致FPS过低时,在不影响最终效果的前提下适当地减少粒子数目,从而增加FPS。
2.5 程序运行测试效果图
图3 程序运行效果(进行了反色处理)
在上述PC机上的程序运行测试,测试结果表明,该程序FPS达到了65-70,完全满足了实时性的要求。
3 结论
本文对基于粒子系统和物理场建模的实时飘雪过程模拟方法进行了研究,没有采用传统的流体力学建模方法及OpenGL平台,而是采用了基本的物理学动力学知识对风场和雪花粒子及它们的相互作用进行了建模,同时对传统的粒子系统绘制过程进行了适当的优化,并且利用微软的DirectX平台进行了程序的设计和编写。
责编/万海滨
参考文献
[1]REEVES W T. Particle Systems—a Technique for Modeling a Class of Fuzzy Objects[C] //SIGGRAPH, 1983, 17(3): 359-376.
[2] 王长波.飘雪场景的实时模拟[D].杭州:浙江大学,2006.
[3] 陈蕾,陈贺新,王润杰,励映群.可视环境的仿真中粒子系统的应用[C]//第五届全国仿真器学术会论文集, 2004.
[4] 吴望一.流体力学[M].北京:北京大学出社,2004.
[5] 吴德馨 风工程与工业空气动力学[M]国防工业出版社,2006.
[6] 王德才.精通DirectX 3D图形与动画程序设计[M].北京:人民邮电出版社,2007.
[7] DUNN F,PARBERRY I.3D数学基础:图形与游戏开发[M].史银雪,陈洪,王荣静,译,北京:清华大学出版社,2005.