一种基于粒子系统的火焰模拟加速改进算法的利记博彩app

文档序号:6356109阅读:387来源:国知局
专利名称:一种基于粒子系统的火焰模拟加速改进算法的利记博彩app
技术领域
本发明涉及一种基于粒子系统的火焰模拟加速改进算法。
背景技术
在计算机图形学中,如何渲染模糊物体一直是一个研究的热点。所谓的模糊物体 (Fuzzy Object)是指像火,云之类的没有固定边界的物体。这类物体是自然的重要组成部 分,因而在游戏,电影,动画以及虚拟现实技术中都占据了重要的地位。这类物体在真实感 图形的研究领域中一直是一个难题。传统的计算机模拟手段通常是通过三角曲面片来逼近 自然物体的表面。然而在模拟模糊边界的物体时,这种方法就不适用了。边界的复杂性和 动态性使得三角片的构造异常复杂,并且在更新时需要大量的计算,这些都不符合实时性 的要求。因此人们开始寻求新的模拟模糊物体的方式。现有的模拟方法主要有两种,一种是基于纹理模型的,比如Perlin噪声算法 (Perlin Noise algorithm),这种方式主要是通过计算对纹理映射进行扰动,以产生更加 接近自然的纹理。另一种是基于物理模型的,也就是粒子系统。粒子系统是由William Reeves在1982年提出的。他详细描述了粒子系统的概念和粒子系统的构架方式。在之后 的近30年间,他的粒子系统模型一直是现代粒子系统的基础。Reeves的粒子系统可以概述 为以下模型每个粒子的属性都可以表示为一个均值和一个随机值的加和。均值表现出粒 子的基本形态,随机值在渲染的时候生成,以产生模糊边界的效果。粒子具有生命周期。生 命周期内,每一帧可通过加速度计算粒子的速度,进而计算粒子的位移。粒子的颜色由初始 颜色与末端颜色以粒子生命为参数插值得到。当粒子生命结束时,系统将重新给粒子赋予 新的生命和属性。在现代的粒子系统中,主要有以下两个新的结构1、粒子发射器。粒子发射器主 要是由于决定粒子出生时的初始速度和位移。这样使得用户或开发者对粒子的形态有更 好的控制。另外,粒子发射器可以很好的模拟燃烧物的几何形态,如圆柱,球等。这样可以 处理更多不同类型的火焰。2、作用力管理器。作用力是用于决定每一帧中粒子的加速度。 粒子系统中的作用力主要分为两种常规作用力(如风场,涡旋力,拉力等)和随机作用力 (如气流等)。通过常规作用力可以很好的塑造火焰的外观,随机作用力则用于增强火焰的 动态和自然感。在火焰模拟中,最影响效率的主要是两个步骤计算和渲染。对于渲染步骤通常 的做法是采用GPU(Graphic Processing Unit,图形处理器)程序设计,将需要绘制的数 据直接写入显卡的缓存中。在计算上,刘宁等在第31届IEEE国际计算机软件与应用年会 上提出了一种轨迹法来减少粒子系统的计算量(可参见文献Ning Liu, Rong Li, Zhenyu Yang, Hongyang Chao.An OptimizationMethod for Real-Time Natural Phenomena Simulation on WinCE Platform.3IstAnnual IEEE International Computer Software and Applications Conference,2007,Vol. 2,pp. 57-62)。对于大规模渲染而言,假定需要 渲染m个粒子,轨迹法先挑出η个粒子进行预处理,其中η << m。预处理的过程就是让这η个粒子在给定的粒子系统中经历一次生命周期,并且将每一帧这些粒子的属性都记录下 来。假定一个粒子总共有k帧的话,这k帧就构成了这个例子的一个轨迹。预处理结束后 粒子系统就有了η条轨迹。之后再进行真正的粒子数据的计算和渲染。粒子属性计算的方 式如下对于m个粒子,每个粒子出生时选定随机一条轨迹,之后每一帧都复制选定轨迹的 下一帧的属性。当粒子到达轨迹的末端时,再重新选择一条轨迹开始进行新的一轮的计算, 直到系统退出。可以看到轨迹法极大的减少了粒子系统的计算量。事实上,每一帧的计算量仅仅 是复制m个粒子属性结构所花的时间。但是,相应的这个方法付出的代价是火焰的真实感 大大下降。由于大量的粒子只能沿较少的轨迹运动,而且轨迹时静态的,即在预处理阶段生 成后就不再更新,因此火焰的自然性得不到保证。另外,对于大规模表面燃烧而言,当η个 轨迹无法覆盖整个表面时这个方法是不适用的,因为粒子仅能选取η个固定的发射点。

发明内容
考虑到上述技术问题,本发明人开始寻找能够提高火焰模拟效率同时能不丢失真 实感的方法。通过对粒子系统的分析,本发明人发现计算量最大的部分在于粒子的加速度, 达到了约84%的计算量。而事实上越复杂的粒子系统在这部分的计算开销也越大。因此本 发明人考虑对轨迹法进行改进。鉴于此,本发明提出了一种基于粒子系统的火焰模拟加速 改进算法,它一方面保持了轨迹法所带来的计算上的高效性,另一方面它克服了轨迹法模 拟火焰时出现的失真现象,同时它还能够适用于大规模表面燃烧的情况,拓广了轨迹法的 适用范围。本发明采用如下技术方案来实现一种基于粒子系统的火焰模拟加速改进算法,包括如下步骤假定当前系统模拟 的火焰需要η个粒子和m条轨迹;步骤1 预处理对η个粒子进行模拟计算,直到所有m个粒子都完成一整个生命周期,并且在模 拟过程中记录下粒子每一帧的属性,从而形成轨迹,所述轨迹包括以下属性加速度、颜色、 生命值;模拟计算的具体操作包括由作用力管理器生产下一帧的加速度,生命值=生命 值-更新时间X系数,颜色=初始颜色+(最终颜色-初始颜色)X生命值;预处理后得到 m条轨迹;步骤2:生成粒子由粒子发射器按照定义的规则随机产生η个粒子的初始位移和速度;步骤3:分配粒子轨迹对于生成的每一个粒子,为其选择一条轨迹;步骤4:更新和渲染(1)更新粒子属性对于每个粒子,拷贝其所属轨迹中对应当前帧的属性作为粒 子当前属性,即粒子加速度=轨迹加速度,粒子颜色=轨迹颜色,粒子生命值=轨迹生命 值,然后更新粒子其他属性,若粒子已经到达轨迹的最后一帧,则进入步骤5 ;(2)渲染粒子;(3)更新轨迹生命值属性,即生命值=生命值-更新时间X系数,其中系数为步骤
51中所述的系数,如果轨迹的生命小于0,进入步骤6 ;(4)循环步骤4,直到系统退出;步骤5:重新生成粒子若有1个粒子完成了生命周期,则粒子发射器重新生成一个粒子,具体操作如步 骤2;步骤6:重新计算轨迹若有1条轨迹完成了生命周期,则用1个粒子重新进行一次模拟计算,具体操作如 步骤1,完成后得到一条新的轨迹,将新的轨迹的属性覆盖原有轨迹的属性,然后将原粒子 链表中的粒子全部进行一次重新生成,具体操作如步骤4。进一步的,在上述步骤2中,粒子的位移是依据选定的概率模型在发射器的表面 或内部随机产生的,而粒子的速度则是依据发射方向和发射角形成的圆锥内随机选择发射 方向。在上述步骤3中,为一个粒子选择一条轨迹对应的具体操作如下将该粒子的地 址添加进这条轨迹的结构中的粒子链表里,同时在粒子自身的属性里添加上该轨迹的编 号,并把当前帧数设为第一帧;在步骤5中,不再为该新生成的粒子分配新的轨迹,而是将 旧粒子从原轨迹的粒子链表中删除,把新粒子添加进粒子链表中,同时在新粒子的属性中 添加该轨迹的编号,并把当前帧数设为第一帧,然后返回步骤4。在上述步骤4的更新粒子属性中,所述其他属性包括粒子速度、粒子位移和帧数, 具体更新方式如下粒子速度=粒子速度+粒子加速度X时间;粒子位移=粒子位移+粒 子速度X时间;帧数=帧数+1。在上述步骤4中的渲染粒子的具体方法如下使用VBO技术进行渲染,每个粒子的顶点数据分为三部分正方形曲面片的顶点 坐标,共4个三维数据;四个顶点的RGBA颜色值,共4个四维数据;四个顶点对应的纹理坐 标,共4个二维数据;其中纹理坐标对于每个粒子在每一时刻都是不变的,即从右上角顶 点开始沿逆时针依次为(1,1),(0,1), (1,0), (0,0);使用VBO渲染的具体操作如下1)对顶点坐标数据和颜色数据,分别调用glBindBufferARB和glBufferDataARB 函数将缓冲区和数据进行绑定,然后调用glMapBufferARB函数获得缓冲区的指针;2)假定上一步中得到的顶点数据缓冲区指针为P,粒子的位置坐标为(x,y,z),粒 子半径为r,则对第η个粒子数据的赋值如下ρ [4n]. χ = x+r ;ρ [4η]. y = y+r ;ρ [4η]. ζ = ζ ;ρ [4η+1]. χ = x_r ;ρ [4η+1]. y = y+r ;ρ [4η+1]. ζ = ζ ;ρ [4η+2] · χ = χ-r ;ρ [4η+2]. y = y-r ;ρ [4η+2]. ζ = ζ ;ρ [4η+3]. χ = x+r ;ρ [4η+3]. y = y-r ;ρ [4η+3]. ζ = ζ ;假定上一步获得的颜色数据缓冲区指针为c,更新后粒子的颜色属性为(R,G,B), 生命值为life,则对第η个粒子数据的赋值如下c [4η] · R = c [4n+l] · R = c [4n+2] · R = c [4n+3] .R = R;c [4n] · G = c [4n+l] · G = c [4n+2] · G = c [4n+3] .G = G;c [4n] .B = c [4n+l] · B = c [4n+2] · B = c [4n+3] · B = B ;
c[4n]. A = c[4n+l], A = c[4n+2], A = c[4n+3], A = life ;3)当全部的缓冲区的数据都被更新过后,调用glBindBufferARB和 glUnmapBufferARB函数将顶点坐标数据和颜色数据从缓冲区刷新到显卡,然后调用 glEnableClientMate函数开启顶点坐标、颜色和纹理坐标的指针用于渲染,再依次调用 glBindBufferARB函数和顶点坐标、颜色和纹理坐标对应的指针函数,将开启的指针指向相 应的数据;4)最后,调用glDrawArrays函数进行渲染,渲染结束后调用 glDisableClientState函数来关闭顶点、颜色和纹理坐标指针。下面,将本发明的火焰模拟加速改进算法与传统的方法以及轨迹法进行比较,比 较分为两个方面。第一方面是系统效率,这里我们将使用FPS (Frame perSecond,每秒帧数) 作为评价指标,FPS越高说明效率越高。测试使用计算机的刷新频率为60Hz,即FPS最高为 60。我们分别使用三种方法对不同粒子数进行渲染并统计其FPS。对于轨迹法和本发明的 火焰模拟加速改进算法,我们都选取1,000条轨迹,这样当粒子数为1,000时,三种方法是 等价的。测试结果如下表所示
粒子数传统方法轨迹法本发明改进算法1,00059.52 FPS59. 52 FPS59.52 FPS10,00048.32 FPS59.52 FPS59. 52 FPS50,0009.47 FPS59.52 FPS59.52 FPS100,0004.42 FPS29.76 FPS29. 76 FPS200,0001.92 FPS15.36 FPS14.88 FPS可见本发明改进算法在效率上基本保持了轨迹法的高效性,当粒子数为100,000 时,FPS较之传统方法提高了 6. 73倍。第二方面,比较三种方法所渲染的火焰的真实感。这里我们选择了两组有代表性 的火焰,第一组是蜡烛火焰,这是一种小型的静态燃烧的火焰,粒子数为10,000,轨迹数为 l,000o第二组是大型火圈,这是一种大规模表面燃烧,粒子数为100,000,轨迹数为1,000。 测试结果图5所示。可见本发明改进算法在火焰真实感上与传统方法接近,而较之轨迹有了大幅度的 提高。同时本发明改进算法克服了轨迹法不能渲染大规模表面燃烧的问题。综合以上两方面的测试,本发明改进算法综合了传统方法和轨迹法的优点,是一 种即能够高效计算又能够真实渲染的火焰模拟加速改进算法。


图1为本发明实施例的火焰模拟加速改进算法流程图;图2为本发明实施例的典型数据结构示意图;图3为本发明实施例所示用的纹理图;图4为本发明实施例的作用力(涡旋和拖拽)表示图;图5为采用本发明火焰模拟加速改进算法与传统方法、轨迹法对不同火焰类型使 用不同粒子数进行渲染的火焰视觉效果测试图。
具体实施例方式下面,结合附图和实施例来对本发明的具体实施方式
做详细说明。具体算法描述如下假定当前系统模拟的火焰需要η个粒子和m条轨迹。本算法的流程对应图1。步骤1 预处理对η个粒子进行模拟计算,直到所有η个粒子都完成一整个生命周期,并且在模 拟过程中记录下粒子每一帧的属性,从而形成轨迹,所述轨迹包括以下属性加速度,颜色, 生命值。模拟计算的具体操作包括由作用力管理器生产下一帧的加速度,生命值=生命 值-更新时间X系数,颜色=初始颜色+(最终颜色-初始颜色)X生命值。其中生命值 的初始设为1,这样生命值可以直接作为alpha值使用,这里的系数是指生命值归一化的系 数,即系数=1/生命周期的实际时间。加速度是由作用力管理器依据指定的作用力产生 的。预处理后得到m条轨迹。在预处理阶段不进行渲染工作。在本实施例中,我们用于测试的粒子系统中设置了以下几种作用力涡旋,拖拽, 风力和气流。关于这几个作用力的具体实施见如下说明如图4所示,A点表示粒子的出生点,B点表示粒子的当前位置,a向量表示粒子的 发射方向,c向量由a与b做外积得到,d向量则是c向量在与a向量垂直的平面上逆时针 旋转θ角得到。其中这个θ角称为涡旋的偏角,对于火焰模拟,通常取θ =90°。涡旋 产生的加速度的方向即为d向量,大小由用户指定。拖拽产生的加速度方向为b向量的反 方向,大小由用户指定。风力产生的加速度为固定的方向,这个方向和大小都由用户指定。 气流产生的加速度为水平面上的随机方向,用户指定加速度的最大值A,实际加速度大小在 更新阶段产生0到A之间的随机值。步骤2:生成粒子由粒子发射器按照定义的规则随机产生η个粒子的初始位移和速度。其中定义的 规则是指粒子发射器自身的规则,包括粒子发射器的几何性质(如线,球体,圆环等),粒子 分布概率模型(如均勻分布,正态分布等),以及粒子发射方向和发射角(发射角是指以发 射方向为轴的圆锥的锥顶角)。粒子的位移是依据选定的概率模型在发射器的表面或内部 随机产生的,而粒子的速度则是依据发射方向和发射角形成的圆锥内随机选择发射方向。 图5给出的火焰形态测试实例中所使用的参数如下蜡烛火焰所使用的粒子发射器是线形 几何体(长度为1个OpenGL单位),使用均勻分布,发射方向为(0,1,0),发射角为60° ; 火圈所使用的粒子发射器是圆环形几何体(半径为15个OpenGL单位),使用均勻分布,发 射方向为(0,1,0),发射角为90°。步骤3:分配粒子轨迹轨迹和粒子的数据结构见图2。对于生成的每一个粒子,为其选择一条轨迹。为一 个粒子选择一条轨迹对应的操作即是将该粒子的地址添加进这条轨迹的结构中的粒子链 表里(如图2所示),同时在粒子自身的属性里添加上该轨迹的编号,并把当前帧数设为第 一帧。由于粒子是随机生成的,为了尽可能保证每条轨迹上的粒子数平均,我们将η个粒子 依次分配给m条轨迹,即第1条轨迹上有第1、m+l、2m+l……号粒子,第2条轨迹上有第2、 m+2、2m+2......号粒子等等。步骤4:更新和渲染
8
该步骤分为几个小步骤(1)更新粒子属性。对于每个粒子,拷贝其所属轨迹中对应当前帧的属性作为粒子 当前属性,即粒子加速度=轨迹加速度,粒子颜色=轨迹颜色,粒子生命值=轨迹生命值。 然后更新粒子其他属性。本实施例中的粒子其他属性包括粒子速度、粒子位移和帧数,具体 更新方式如下粒子速度=粒子速度+粒子加速度X时间;粒子位移=粒子位移+粒子速 度χ时间;帧数=帧数+1。若粒子已经到达轨迹的最后一帧,则进入步骤5。(2)渲染粒子,在测试实例中,我们使用OpenGL作为引擎,采用了正方形曲面片的 方式来表达一个粒子,通过对曲面片贴上合适的纹理(实例中所使用的纹理如图3所示), 再由粒子属性中计算得到的颜色和alpha值(在这里同时也是生命值)来进行绘制。四方 形的中心的位置即为粒子的位移,四方形的大小由用户指定。为了提高渲染的效率,我们采用了 OpenGL的VBO(Vertex Buffer Object,顶点缓 冲区对象)技术。VBO技术是OpenGL提供的一种新技术,其工作原理是在系统内存中开辟 一块缓冲区并与显卡进行映射,同时将顶点数据存放在这个缓冲区中,这样既可以方便程 序修改数据,又能实现内存到显卡的高速传输,从而可以一次性高效地渲染大量对象(可 参考文献M. J. Kilgard,“ModernOpenGL Usage =Using Vertex Buffer Objects Well, "ACM SIGGRAPH ASIA 2008Courses,No. 49,2008)。使用VBO技术进行渲染时,我们所要用到的 每个粒子的顶点数据分为三部分正方形曲面片的顶点坐标(共4个三维数据),四个顶点 的RGBA颜色值(共4个四维数据),四个顶点对应的纹理坐标(共4个二维数据)。其中 纹理坐标对于每个粒子在每一时刻都是不变的,即从右上角顶点开始沿逆时针依次为(1, 1),(0,1), (1,0), (0,0)。而顶点坐标和其对应的颜色数据则在每一帧的渲染前由每次更 新的粒子属性来确定。使用VBO渲染的具体操作如下1.对顶点坐标数据和颜色数据,分别调用glBindBufferARB和glBufferDataARB 函数将缓冲区和数据进行绑定,然后调用glMapBufferARB函数获得缓冲区的指针。2.以顶点坐标数据为例,假定上一步中得到的定点数据缓冲区指针为P,则p
至P[3]为第一个粒子的顶点坐标数据,p
为其第一个顶点坐标(通常为右上角,1个三 维坐标数据);以此类推第η个粒子的顶点坐标数据为P Wn]至ρ [如+3]。然后根据更新后 的粒子属性为其赋值,假设粒子的位置坐标为(X,1,ζ),粒子半径为r,则对第η个粒子数据 的赋值如下ρ [4n]. χ = x+r ;ρ [4η]. y = y+r ;ρ [4η]. ζ = ζ ;ρ [4η+1]. χ = x_r ;ρ [4η+1]. y = y+r ;ρ [4η+1]. ζ = ζ ;ρ [4η+2] · χ = χ-r ;ρ [4η+2]. y = y-r ;ρ [4η+2]. ζ = ζ ;ρ [4η+3]. χ = x+r ;ρ [4η+3]. y = y-r ;ρ [4η+3]. ζ = ζ ;颜色数据的处理方法类似,不同的地方是四个顶点的颜色数据是一样的,故假 定上一步获得的颜色数据缓冲区指针为c,更新后粒子的颜色属性为(R,G,B),生命值为 life,则对第η个粒子数据的赋值如下c [4η] · R = c [4n+l] · R = c [4n+2] · R = c [4n+3] .R = R;c [4n] · G = c [4n+l] · G = c [4n+2] · G = c [4n+3] .G = G;c [4n] .B = c [4n+l] · B = c [4n+2] · B = c [4n+3] · B = B ;c[4n]. A = c[4n+l], A = c[4n+2], A = c[4n+3], A = life ;
3.当全部的缓冲区的数据都被更新过以后,调用glBindBufferARB和 glUnmapBufferARB函数将顶点坐标数据和颜色数据从缓冲区刷新到显卡。然后调用 glEnableClientState函数开启顶点坐标,颜色和纹理坐标的指针用于渲染(参数分 别为 GL_VERTEX_ARRAY,GL_C0L0R_ARRAY, GL_TEXTURE_C00RD_ARRAY),然后依次调用 glBindBufferARB函数和对应的指针函数(顶点坐标,颜色和纹理坐标对应的指针函数分 别为glVertexPointer,glColorPointer, glTexCoordPointer)将开启的指针指向相应的 数据。4.最后调用glDrawArrays函数进行渲染,由于我们使用的是正方形曲面片,因此该函数的参数为GL_QUADS。渲染结束后调用glDisableClientMate函数来关闭顶点,颜 色和纹理坐标指针(参数分别为 GL_VERTEX_ARRAY,GL_C0L0R_ARRAY, GL_TEXTURE_C00RD_ ARRAY)。以上为VBO技术的渲染。如果用户的显卡不支持VBO技术,则可以采用传统的渲 染方式,即对于每个粒子,调用如下过程(依旧假定粒子的位置为0^,7,2),半径为1~,颜色 为(R,G,B),生命值为life)glColor4f (R, G, B, life);glBegin(GL_TRIANGLE_STRIP);glTexCoord2d(l,1) ;glVertex3f(x+r, y+r, Z);glTexCoord2d(0,1) ;glVertex3f(χ-r, y+r,Z);glTexCoord2d(l,0) ;glVertex3f(x+r, χ-r,Z);glTexCoord2d(0,0) ;glVertex3f(χ-r, χ-r,Z);glEnd();(3)更新轨迹生命值属性。即生命值=生命值-更新时间X系数,其中系数为步 骤1中所述的系数。如果轨迹的生命小于0,进入步骤6。(4)循环步骤4,直到系统退出。步骤5:重新生成粒子若有1个粒子完成了生命周期,则粒子发射器重新生成一个粒子,具体操作如步 骤2。但是不再为该新生成的粒子分配新的轨迹,而是将旧粒子从原轨迹的粒子链表中删 除,把新粒子添加进粒子链表中,同时在新粒子的属性中添加该轨迹的编号,并把当前帧数 设为第一帧。然后返回步骤4。步骤6:重新计算轨迹若有1条轨迹完成了生命周期,则用1个粒子重新进行一次模拟计算,具体操作如 步骤1。完成后得到一条新的轨迹,将新的轨迹的属性覆盖原有轨迹的属性,然后将原粒子 链表中的粒子全部进行一次重新生成,具体操作如步骤4。
权利要求
1.一种基于粒子系统的火焰模拟加速改进算法,其特征在于包括如下步骤假定当前系统模拟的火焰需要η个粒子和m条轨迹;步骤1 预处理对η个粒子进行模拟计算,直到所有m个粒子都完成一整个生命周期,并且在模拟过 程中记录下粒子每一帧的属性,从而形成轨迹,所述轨迹包括以下属性加速度、颜色、生命 值;模拟计算的具体操作包括由作用力管理器生产下一帧的加速度,生命值=生命值-更 新时间X系数,颜色=初始颜色+ (最终颜色-初始颜色)X生命值;预处理后得到m条轨 迹;步骤2:生成粒子由粒子发射器按照定义的规则随机产生η个粒子的初始位移和速度;步骤3 分配粒子轨迹对于生成的每一个粒子,为其选择一条轨迹;步骤4:更新和渲染(1)更新粒子属性对于每个粒子,拷贝其所属轨迹中对应当前帧的属性作为粒子当 前属性,即粒子加速度=轨迹加速度,粒子颜色=轨迹颜色,粒子生命值=轨迹生命值,然 后更新粒子其他属性,若粒子已经到达轨迹的最后一帧,则进入步骤5 ;(2)渲染粒子;(3)更新轨迹生命值属性,即生命值=生命值-更新时间X系数,其中系数为步骤1中 所述的系数,如果轨迹的生命小于0,进入步骤6 ;(4)循环步骤4,直到系统退出;步骤5:重新生成粒子若有1个粒子完成了生命周期,则粒子发射器重新生成一个粒子,具体操作如步骤2 ;步骤6:重新计算轨迹若有1条轨迹完成了生命周期,则用1个粒子重新进行一次模拟计算,具体操作如步骤 1,完成后得到一条新的轨迹,将新的轨迹的属性覆盖原有轨迹的属性,然后将原粒子链表 中的粒子全部进行一次重新生成,具体操作如步骤4。
2.如权利要求1所述的基于粒子系统的火焰模拟加速改进算法,其特征在于,步骤2 中,粒子的位移是依据选定的概率模型在发射器的表面或内部随机产生的,而粒子的速度 则是依据发射方向和发射角形成的圆锥内随机选择发射方向。
3.如权利要求1所述的基于粒子系统的火焰模拟加速改进算法,其特征在于,步骤3 中,为一个粒子选择一条轨迹对应的具体操作如下将该粒子的地址添加进这条轨迹的结 构中的粒子链表里,同时在粒子自身的属性里添加上该轨迹的编号,并把当前帧数设为第 一帧;在步骤5中,不再为该新生成的粒子分配新的轨迹,而是将旧粒子从原轨迹的粒子链 表中删除,把新粒子添加进粒子链表中,同时在新粒子的属性中添加该轨迹的编号,并把当 前帧数设为第一帧,然后返回步骤4。
4.如权利要求1所述的基于粒子系统的火焰模拟加速改进算法,其特征在于步骤4 的更新粒子属性中,所述其他属性包括粒子速度、粒子位移和帧数,具体更新方式如下粒 子速度=粒子速度+粒子加速度X时间;粒子位移=粒子位移+粒子速度X时间;帧数= 帧数+1。
5.如权利要求1所述的基于粒子系统的火焰模拟加速改进算法,其特征在于 所述步骤4中渲染粒子的具体方法如下使用VBO技术进行渲染,每个粒子的顶点数据分为三部分正方形曲面片的顶点坐标, 共4个三维数据;四个顶点的RGBA颜色值,共4个四维数据;四个顶点对应的纹理坐标,共 4个二维数据;其中纹理坐标对于每个粒子在每一时刻都是不变的,即从右上角顶点开始 沿逆时针依次为(1,1),(0,1), (1,0), (0,0); 使用VBO渲染的具体操作如下1)对顶点坐标数据和颜色数据,分别调用glBindBufferARB和glBufferDataARB函数 将缓冲区和数据进行绑定,然后调用glMapBufferARB函数获得缓冲区的指针;2)假定上一步中得到的顶点数据缓冲区指针为P,粒子的位置坐标为(x,y,z),粒子半 径为r,则对第η个粒子数据的赋值如下ρ [4η] · χ = x+r ;ρ [4η] · y = y+r ;ρ [4η] · ζ = ζ ; ρ [4η+1] · χ = χ-r ;ρ [4η+1] · y = y+r ;ρ [4η+1] · ζ = ζ ; ρ [4η+2] · χ = x-r ;ρ [4η+2] · y = y-r ;ρ [4η+2] · ζ = ζ ; ρ [4η+3] · χ = x+r ;ρ [4η+3] · y = y-r ;ρ [4η+3] · ζ = ζ ;假定上一步获得的颜色数据缓冲区指针为C,更新后粒子的颜色属性为(R,G,B),生命 值为life,则对第η个粒子数据的赋值如下c [4n] .R = C [4η+1] · R = c [4n+2] · R = c [4n+3] .R = R; c [4n] .G = c [4n+l] · G = c [4n+2] · G = c [4n+3] .G = G; c [4n] .B = c [4n+l] · B = c [4n+2] · B = c [4n+3] .B = B; c [4n] .A = c [4n+l] · A = c [4n+2] · A = c [4n+3] · A = life ;3)当全部的缓冲区的数据都被更新过后,调用glBindBufferARB和glUnmapBufferARB 函数将顶点坐标数据和颜色数据从缓冲区刷新到显卡,然后调用glEnableClientMate函 数开启顶点坐标、颜色和纹理坐标的指针用于渲染,再依次调用glBindBufferARB函数和 顶点坐标、颜色和纹理坐标对应的指针函数,将开启的指针指向相应的数据;4)最后,调用glDrawArrays函数进行渲染,渲染结束后调用glDisableClientMate函 数来关闭顶点、颜色和纹理坐标指针。
全文摘要
本发明公开了一种基于粒子系统的火焰模拟加速改进算法,包括如下步骤(1)预处理生成轨迹来记录粒子的加速度、颜色和生命值属性;(2)粒子发射器生成粒子;(3)为每个粒子分配一条轨迹;(4)从轨迹获得粒子的以上三种属性并更新粒子其他属性,若粒子达到轨迹末帧则转第5步;渲染粒子;更新轨迹信息,若轨迹生命为0则转步骤(6);本步骤循环直至系统退出;(5)重新生成粒子并分配轨迹;(6)重新计算轨迹并重新生成该轨迹上所有粒子。本发明与传统粒子系统的方法以及轨迹法相比,其优点是一方面大幅降低了传统方法的计算量,起到了加速的作用;另一方面克服了轨迹法渲染的失真问题,并能支持大规模表面燃烧的渲染,起到了改进的作用。
文档编号G06T13/60GK102147928SQ20111006318
公开日2011年8月10日 申请日期2011年3月16日 优先权日2011年3月16日
发明者刘春玲, 吴庆标, 张寻, 李冬平 申请人:美通日用品(杭州)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1