基于粒子系统的水波模拟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于粒子系统的水波模拟
邹运兰;管幼幼
【摘要】水波效果可以增强虚拟现实系统的沉浸感,对水波的模拟在计算机游戏、影视、广告、视景仿真等各领域有着广泛的应用.粒子系统是模拟水波的一种有效方法,基于粒子系统,针对水波的物理特性,推导出了计算水波幅的近似公式,在
VC++6.0环境下使用DirectX函数包,通过数据缓冲区对图像进行水波处理的方法,使得程序的运算速度与水波的复杂程度无关.实验结果表明,模拟的动态水波满足实时性和逼真性要求.%Wave effect enhances the feeling of immersion in a virtual reality system, which has been widely applied to computer games,films, advertisements and vision simulation fields etc. Based on the particle system, emphasizing on the physical properties of water wave, the formula for approximate water amplitude calculation is derived. DirectX function packages are referred to in VC + + 6.0 IDE to add wave effect to images through the data buffer to separate computing speed from wave complexity. Experimental results show simulated dynamic wave satisfies the requirements for real-timeliness and vividness.
【期刊名称】《计算机应用与软件》
【年(卷),期】2011(028)003
【总页数】3页(P110-112)
【关键词】粒子系统;水波;模拟
【作者】邹运兰;管幼幼
【作者单位】浙江万里学院计算机与信息学院,浙江,宁波,315100;浙江万里学院计算机与信息学院,浙江,宁波,315100
【正文语种】中文
0 引言
诸如火焰、云烟、雨滴、雪花、水波等动态自然景物的模拟一直是计算机图形学中一个热门研究课题和难点问题,它们的模拟在航空航天、影视广告、虚拟场景中有着广泛的应用。

具有不规则几何外形和内在不确定性的不规则模糊物体,不能用通常的三维建模方法来制作,不同于静态景物,它们具有产生、发展和消亡的过程,随着近年来研究的不断深入,各种自然景物模拟算法不断涌现,模拟结果也越来越具有真实感。

文献[7]提出的粒子系统绘制算法被认为是迄今为止被认为模拟不规则模糊自然景物最为成功的一种生成算法。

本文基于粒子系统,针对水波的物理特性,推导出了计算水波幅的近似公式,并在VC+ +6.0环境下结合DirectX函数包,对自然界中不规则景物—水波进行了模拟。

1 粒子系统算法原理
粒子系统方法的基本思想是将许多简单开头的粒子作为基本元素聚集起来,形成一个不规则的模糊物体,从而构成一个封闭的系统——粒子系统。

粒子系统并不是一个简单的静态系统,随着时间的推移,系统中已有的粒子不仅不断改变形状,不断运动,而且不断有新粒子加入,并有旧的粒子消亡。

为了模拟粒子生长和死亡的过程,每个粒子均有一定的生命周期,使其经历出生、生长、衰老和死亡的过程。

所以控制粒子系统运行的关键是确定粒子的初始属性、粒子的变化规律和绘制因素。

粒子系统中的每个粒子都有一组属性,如位置、速度、颜色和生命期等。

一个粒子究竟有什么样的属性,主要取决于具体的应用。

与粒子系统有关的每个属性参数均
受到一个随机过程的控制,粒子系统的这一特性充分体现了不规则物体的动态性和随机性,很好地模拟了水、云、喷泉和瀑布等不规则模糊物体。

通常生成粒子系统某瞬间画面的基本步骤是:
1)生成新的粒子并将它加入系统中;
2)赋予每一个新粒子一定的属性;
3)删除已经超过其生命周期的粒子;
4)根据粒子的动态属性对粒子进行移动和变换;
5)绘制并显示由有生命的粒子组成的图形。

2 水波模型
2.1 水波的物理特性
水波有如下几个特性:(1)扩散:当投一块石头到水中,会看到一个以石头入水点为圆心所形成一圈圈的水波,给人感觉是水波上的每一点都是以石头入水点为中心向外扩散的,这是个错觉,实际上,水波上的任何一点在任何时候都是以自己为圆心向四周扩散的,之所以会形成一个环状的波,是因为水波的内部因为扩散的对称而相互抵消了;(2)衰减:水是有阻尼的,否则,当往水池中投入石头,水波就会永不停止地震荡下去;(3)折射:因为水波上不同地点的倾斜角度不同,所以,因为水的折射,从观察点垂直往下看到的水底并不是观察点的正下方,而有一定的偏移。

如果不考虑水面上部的光线反射,那么我们能感觉到水波的形状;(4)反射:水波遇到障碍物会反射;(5)衍射:如果能在水池中央放上一块礁石,或一个中间有缝的隔板,那么就能看到水波的衍射现象了。

有了这几个特性,再运用数学和几何知识,就可以模拟出真实的水波了。

2.2 推导计算水波幅的公式
如果用3DSMAX做水波的动画,渲染一幅真实开头的水波画面至少得好几十秒,而现在需要的是实时的渲染,每秒钟至少得渲染 20帧才能使得水波得以平滑显示。


虑到电脑运算的速度,我们不可能按照正弦函数或精确的公式来构造水波,不能用除法,更不能用sin、cos,只能用一种取近似值的快速算法,尽管这种算法存在一定误差,但是为了满足实时动画的要求,在不影响动画效果的前提下存在一定误差是可以的。

假设存在这样一个一次公式,可以在任意时刻根据某一个点周围前、后、左、右四
个点以及该点自身的振幅来推算出下一时刻该点的振幅,那么就有可以用归纳法求
出任意时刻这个水面上任意一点的振幅。

如图 1所示,在某一时刻,W0点的振幅除
了受 W0点自身振幅的影响外,同时受来自它周围前、后、左、右四个点(W1、W2、W3、W 4)的影响(为了简化,忽略了其它所有点),而且,这四个点对 W0点的影响力
是机会均等的。

那么可以假设这个一次公式为:
图1 水面上的任意几个点
其中,a、b为待定系数,W0′为 0点下一时刻的振幅,W 0、W1、W2、W 3、W 4
为当前时刻的振幅。

下面来求解a和b。

假设水的阻尼为 0,在这种理想条件下,水的总势能将保持不变。

也就是说在任何时刻,所有点的振幅的和保持不变。

即:
将每一点都象公式(1)那样计算,然后代入公式(2),得到:
得到4a+b=1,找出一个最简单的解:a=1/2、b=-1,1/2在编程时可以用移位运算符“>>”来实现,不用进行乘除法,所以这组解是最适用的而且是最快的。

最后得到:
有了式(3)这个近似公式,就可以推广到这个一般结论:已知某一时刻水面上任意一点的波幅,那么在下一时刻,这一点的波幅就等于与该点相邻的前、后、左、右四点的
波幅的和除以 2,再减去该点的波幅。

以上公式是在假设水的阻尼为 0的情况下推导出的,但实际上水是存在阻尼的,一旦在水中增加一个波源,水面将永不停止地震荡下去。

所以还需要对波幅数据进行衰减处理,让每一个点在经过一次计算后,波幅都比理想值按一定的比例降低。

这个衰减速率经过测试,用 1/32比较合适,也就是 1/2的 5次幂,可以通过移位运算很快获得。

3 水波模型实现
3.1 编程环境的配置
实现该水波模型应用程序的工程类型是Win32 App lication,在VC++6.0中,首先需要指定DirectX头文件和库文件所在的路径,以便VC++能够找到这些文件。

默认情况下,DirectX头文件和库文件分别位于路径C:\Program Files\Microsoft DirectX SDK\Include和C:\Program Files\DirectX SDK\Lib\x86下。

在VC6.0中选择Tools|Options|Directories命令,然后输入DirectX头文件和库的路径,点击OK按钮确定便可将DirectX的include和library路径添加至VC++6.0中。

3.2 计算波能数据缓冲区
要构造水波模型,首先要建立两个与水池图像一样大小的数组bu f1[PoolWid
th×PoolHeight]和buf2[PoolWidth×Pool-Height](PoolWidth=水池图像的像素宽度、PoolHeight=水池图像的像素高度)用来保存水面上每一个点的前一时刻和后一时刻波幅数据,因为波幅也就代表了水波的能量,所以称这两个数组为波能缓冲区。

水面在初始状态是一个平面,各点的波幅都为 0,所以这两个数组所有数组元素的初始值都等于0。

对于水池中的每一点,波能扩散的伪代码:
波能衰减的伪代码:
交换波能数据缓冲区的伪代码:
3.3 对页面进行渲染
算出波幅数据后,接下来根据波幅数据对页面进行渲染。

因为水的折射,当水面与我们的视线不垂直的时候,所看到的水下的景物并不是在观察点的正下方,而是存在一定的偏移。

偏移的程度与水波的斜率、水的折射率和水的深度都有关系,如果要进行精确计算的话,显然是不可能的,同样只需要做线性的近似处理就可以了。

因为水面越倾斜,所看到的水下景物偏移量就越大,所以可以近似地用水面上某点的前后、左右两点的波幅之差来代表所看到水底景物的偏移量。

在编写程序时,用一个页面装载原始图像,用另外一个页面进行渲染。

先锁定两个页面,取得指向页面内存区的指针,然后根据偏移量将原始图像上的每一个像素复制到渲染页面上。

锁定两个离屏页面伪代码:
取得页面象素位深度和页面内存指针:
进行页面渲染:
解锁页面伪代码:
3.4 增加波源
为了形成水波,必须在水池中加入波源,可以想像成向水中投入石头,形成波源的大小和能量与石头的半径和扔石头的力量都有关系。

基于此,只要个性波能数据缓冲区buf,让它在石头入水的地点来一个负的“尖脉冲”,即让buf[x,y]=-n.。

经过实验,n
的范围在 32~128之间比较合适。

有了波源,就需要控制波源的半径,只要以石头入水中心点为圆心,画一个以石头为半径的圆,让这个圆中所有的点都来一个负的“尖脉冲”就可以了(这里也做了近似处理)。

增加波源的伪代码:
首先判断坐标是否在屏幕范围内:
以上x、y、stonesize和stoneweight分别为x坐标、y坐标、波源半径和波源能量。

4 实验结果
在上面的推导中,每一步都进行了很多看似非常过分的近似处理,但是在笔者的电脑Windows XP、Intel(R)Pentium(R)4 CPU 3.00GHZ、内存1.00GB环境下,在VC++6.0中使用W in32非控制台应用程序,使用DirectX 9.0函数开发包编写程序,实现了该动态水波模型,1024*768的画面大小,每秒可以达到 25帧,实验结果表明,用这种方法在速度和图像上都可以获得很好的效果。

如图2所示为以一幅Windows桌面图作背景,模拟下雨时,雨点掉入水中时的水波截图。

图2 水波截图
5 结束语
对不规则物体进行模拟是虚拟现实技术和计算机图形学研究的重点之一,粒子系统是其中的一个有效方法。

本文所实现的水波模拟是从系统的简单性、实时性以及模拟的逼真程度出发,提出的一种实现方法,针对水波的物理特性,推导出了计算水波幅的近似公式,并利用数据缓冲区对图像进行水波处理的方法,使得程序运算速度与水波的复杂程序没有关系,无论水面是风平浪静还是波涛汹涌,程序的fps始终保持不变。

参考文献
[1]汪继文,金余峰,苏守宝,等.基于粒子系统和音频系统的烟花模拟[J].计算机应用与软件,2009(7):85-87.
[2]肖何,何明耘,白忠建.OpenGL中基于粒子系统的喷泉模拟实现[J].计算机仿
真,2007(12):201-203.
[3]唐洁.游戏开发中的粒子系统分析[J].电脑编程技巧与维护, 2005(4):77-81.
[4]Ebert D S,Parent RE.Rendering and animation of gaseous phenomena by combining fast volume and scan line A2 buffer technique.ACM Computer Graphic(SIGGRAPH'90),1990,24(4):357-366.
[5]SzeliskiRichard,Tonnesen David.Surfacemodeling with oriented particle systems[J].Computer Graphics,1992,26(4):185-194.
[6]Revees W T,Blau R.Approximate and probabilistic algorithms for shading and renderstructured particle system[J].Computer Graphics,
1985:19(3):313-322.
[7]W T Reeves.Partic le systems-a technique formodeling a class of fuzzy object[J].Computer Graphic,1983,17(3):359-376.。

相关文档
最新文档