三维粒子系统在FlashAS2中的实现

2008-04-02 10:43:53来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


  摘要:

  本文通过粒子系统及三维粒子透视投影变换,运用FlashAS2及其研发环境,实现了基本的三维粒子系统。并结合相关的曲线及运动方式,实现了抛体运动,Fermat螺线上升运动连同龙卷风效果。表现了一定的数字艺术层的美感。

  关键词:粒子系统,三维,数字艺术

  1前言:

  三维粒子系统是一类令人感到激动又十分有趣的动画程式。他的实现方式主要需要用基于粒子系统构建的图像学,动力学连同数字艺术等多方面的知识。[1]介绍了基本的三维视图通过透视投影变换到二维场景的方式。[2]介绍了一个基本的粒子系统的实现。在这两篇文章的基础上,再结合比较简单的运动学方面的知识,在本文中实现了基本的三维粒子系统,并实现了抛体运动,Fermat螺线上升运动连同龙卷风效果。这些作品表现了一定的数字艺术层的美感。

  另外,研发选用的是基于AS2语言的Flash研发平台,这种研发模式具备以下长处:

  1)Flash播放器具备极高的普及率,而且swf文档格式是跨平台的。

  2)Flash的失量图像处理模式极强,适合网络传播图像,动画及各类互动效果。

  3)Flash平台下的交互动画研发方便,采用了AS2语言能够面向对象的模式来组织程式结构。交互效果能够实现的很到位。能够说,是一种面像图像研发的脚本语言。(正如Matlab能够说是面向科学工程计算的脚本语言相同。)

  当然,这种模式也是有缺点的,比如Flash播放器在处理一些较大运算时的效果不是很

  理想。

  由于这个程式重点在实现相应的图像效果上,主要是测试之用,所以采用Flash的AS2

  来进行是很合适的。

  2程式总体思路及关键部分:

  2.1粒子系统的框架:

  [2]中已有叙述,这里简要回顾之:

  


  Initialization

  while(runFlag)

  {

  Forallparticles

  {

  If(currentparticleisnotlived)

  {

  Initthisparticle.

  }

  Elseif(currentparticleisoutoftheshowingarea)

  {

  Currentparticlesettodead.

  }

  }

  }
2.2三维粒子在二维场景的透视成像:

  [1]中已有详述,这里简要回顾之:

  对于一个在三维场景中的点p(x,y,z)

  其在距离原点距离为d处的位于z轴正半轴上的点(0,0,d)而言,其对应到二维投影面的点p’(x’,y’)有如下计算公式:

  


  x’=x/(-z/d 1)

  y’=y/(-z/d 1)

  
三维粒子系统在Flash AS2中的实现

  图1

  2.3.1抛体运动模式关键:

  抛体运动在这里的右手坐标系(图1)中,是指以y为竖直运方向作上抛运动,x,z方向以固定速度运动的方式。我们在公园里看到的许多喷泉就是这样的例子。

  由于初始化后任何粒子统一生成,所以要看到类似喷泉的效果,需要待几个粒子生成周期之后,生成粒子和死亡粒子能够持续交替时,便会呈现出不错的效果。图2展示了300粒子在程式运行过几个粒子生成周期后的效果。

  相应初始程式、参数及运动函数如下:

  


  //dataset

  tmp=Math.random();

  _root.particleArr[i].initV_A((2 random(3))*Math.cos(2*Math.PI*tmp),15 random(10),(2 random(3))*Math.sin(2*Math.PI*tmp),0,-0.5 0.15*Math.random(),0);

  _root.particleArr[i].initPos(gX0-10 random(20),gY0-50 random(150),gZ0-10 random(20));

  //motioneffectmode

  for(vari:Number=0;i<_root.gParticleNum;i )

  {

  if(_root.particleArr[i].isLived())

  {

  _root.particleArr[i].moveCal();

  _root.particleArr[i].moveShow();

  }

  }
图2

  三维粒子系统在Flash AS2中的实现

  2.3.2Fermat螺线上升运动:

  Fermat螺线的极坐标表达为:

  ρ=a*θ^(1/2)

  这里要做的,就是将θ角在某粒子和xz平面垂直的截平面上对应的Fermat螺线极坐标转换成x及z坐标值。再进行相应的更新即可。和前一种不同的是,这里只有y轴方向需要用到vy,而x,z轴的位置则由于采用了坐标控制模式,所以无需使用vx,vz。为了整体程式设计上的统一,可将vx,vz设定为0。

  和上一个抛物线型运动不同,这里的Fermat螺线运动假如新生粒子和死亡粒子构成了持续生成关系时,将使画面较为混乱。因此,需要将粒子的初始y值及vy,ay设定的靠近些。

  能够看到,团状的粒子簇旋转上升后又扩散下降,无序之中体现着一丝韵律,我将这样的效果命名为“银河落九天”,不知诸位为以为如何?(参图3)

  
//dataset

  tmp=Math.random();

  _root.particleArr[i].initV_A(0,18 random(2),0,0,-0.5 0.1*Math.random(),0);

  _root.particleArr[i].initRotateEle(0,0,2*Math.PI*i/_root.gParticleNum);

  _root.particleArr[i].initPos(gX0-15 random(30),gY0-5 random(10),gZ0-15 random(30));

  _root.particleArr[i].fermatSpiralA=15 random(10);

  //motioneffectmode

  for(vari:Number=0;i<_root.gParticleNum;i )

  {

  if(_root.particleArr[i].isLived())

  {

  _root.particleArr[i].accTheta(Math.PI/18);

  _root.particleArr[i].moveCalFermatSpiralWithY();

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: Flash8.0教程:动态模糊效果

下一篇: 将对象分层以应用补间动画