• AS星尘粒子系统 初识 1


    新项目需要,开始接触粒子系统。对比各大粒子引擎,最终选择Stardust Particle Engine。

    可能是我比较懒,没找到相关的中文资料。也许实际上研究的人不多吧。所以,我HOLYCY就用自己蹩脚的英语翻译了大致的内容。

    以下是引擎文档英文的一些整理,概括这个粒子系统特性以及能干什么。

    这个粒子系统支持2D以及3D 特效,并且易于扩展,它是基于出名的Flint粒子引擎而改装,内置了ZedBox,Pv3D等3D引擎,当然你也可以使用其他引擎。同时这个粒子系统也包括了Flash原生内置的3D引擎。

    类似PV3D 或ND3D 的3D引擎,通常是画draw出一个显示对象到bitmap上并且让这个位图成为粒子的材质。如果这个显示对象的尺寸过大,这通常导致一些性能上的问题,甚至当它只是包括一些简单的矢量图形也会这样。

    星尘3D和zedBox并不会把这个显示对象画到bitmap上,他们直接将显示对象add到显示列表中,因此显示对象依旧是被FP作为矢量图来被渲染。他们基于透视投影算法来控制显示对象的位置和尺寸,取代将其画到位图上并生成在一个3D对象上。

    星尘系统支持重力和模拟变流。所以模拟重力,风力黑洞之类的效果是小CASE啦。

    星尘系统支持行为触发,可以定制很多种行为。

    作者最喜欢的功能就是它支持XML,用来保存粒子的配置。这样,当需要改变粒子的外观或行为时,就直接改配置就可以了。

    接下来是相关基础类的介绍:

    StardustElement:是以下类的基类,定义了粒子系统中一个元素最基本的属性和方法:Emitter, Initializer, Action, Clock, Renderer, Random, Field, Deflector, and Zone.

    Emitter:粒子发射器。主要用于创建新的粒子,在主循环中更新粒子,并且从模拟(simulation)中移除死亡的粒子。你需要反复的调用step()方法来保持simulation的继续进行。step()方法是星尘粒子系统的主循环中的方法。

    Initializer:这个类用于粒子出生时的初始化粒子相关属性。一个Initializer可以通过发射器(emitter)的addInitializer()方法添加到一个发射器(emitter)上。可初始化粒子的位置,速度,角度,角速度,块,遮罩,透明度,尺寸,等。。

    Action:通过调用发射器(emitter)的step()方法来操作粒子的属性。它可以更新粒子的速度,重力等。。

    Clock:时钟频率。这个类决定发射器生成新粒子的频率。当emitter.step()被调用的时候,发射器(emitter)会调用相关的Clock的getTicks()方法来决定有多少新粒子会被创建。

    Renderer:呈现器。emitter更新粒子的数据,不过数据毕竟只是数据,并不是可视的。通过Renderer类来将数据转化为屏幕可显示对象。如果你需要使用特殊的3D引擎的画你可以通过继承这个类来创建你自己的Renderer。 Engine-specific 代码只能用用这个类写以及初始化。

    Random:总言之,用他来产生随机值,包括随机大小,角度,透明度等。

    Field:域。表示一些向量域。可用做重力域,冲力域等。比如,一个UniformField(均匀场)对象,顾名思义,一个均匀的向量场。如果作用点向下可用于创建地心引力,或者massless为false时创建风的效果。

    Deflector:转向器。

    输入一个粒子的位置和速度,能产生新的位置和速度。通过这种转向行为,你能在原位置速度基础上操控出新的位置和速度。

    Zone:地域,区域。

    这个类用于描绘几何的区域。一个区域产生随机的点,通过getPoint()方法拿到包含在这个区域中的点,这个点能用来初始化粒子的位置和速度。

    3D版本的Deflector,Field,Zone类 分别是 Deflector3D, Field3D, and Zone3D。

    下面介绍的类不是StardustElement的子类,而是VO(valueObject)类。--------------------

    Particle: 粒子。

    这个类是粒子的VO类。定义了粒子的属性,类似mask, mass, scale, alpha, 和collision radius等。他的子类:Partical2D和Particle3D,一些属性不一样。比如2D向量和3D向量。

    Vec2D & Vec3D :

    用2D和3D方式表现向量。这些类为2D和3D提供一些矢量操作方法,比如点积和向量积。

    MotionData2D & MotionData3D :

    这几个类是老版本的向量类:他们的目的是保存变量,不为向量操作提供任何方法。

    MotionData4D & MotionData6D :

    这两个类拥有MotionData2D 和 MotionData3D 类两倍的属性。主要是用在粒子的位置和速度信息的转向行为上。

    使用这个粒子系统的大致工作流程:

    1.  先创建一个时钟频率 clock。

    2.  创建一个发射器emitter,设置这个发射器的时钟(第一步创建的clock)的一些属性。

    3.  创建一个呈现器Renderer。

    4.  通过renderer的addEmitter()方法添加emitter到renderer中。

    5.  通过emitter的addInitializer()方法添加initializer初始化器到发射器emitter中。

    6.  通过emitter的addAction()方法添加action动作到发射器emitter中。

    7.  通过主循环(由EnterFrame或Timer或其他产生的)循环调用emitter的step()方法。就可以工作了。

    主循环:

    主循环涉及到了如下的进程(工作):

    1.  时钟检查阶段:

    发射器通过clock得知多少个粒子将被创建。 clockgetTicks()方法的返回值决定了粒子创建的数量。

    2. 新粒子的创建阶段:

    发射器创建了新的粒子(数量是由时钟决定的),把粒子添加到粒子列表中。emitter让他的initializer来初始化这些新的粒子。

    3.  新粒子初始化阶段。

    通过initializer.initialize() 进行初始化。

    注意的是,每个initializer都有一个priority属性,这些initializer通过这个属性来分类并且按顺序来初始化新粒子。

    4.  新粒子的渲染阶段:

    当新粒子被添加并且初始化后,发射器会派发一个事件:EmitterEvent.PARTICLES_ADDED。Renderer监听这个事件,调用renderer.particlesCreated()。这个方法负责新粒子效果的处理。

    比如,DisplayObjectRendrerer 将新的粒子对应的显示对象添加到一个显示对象容器的显示对象列表里。

    5.  动作预更新阶段:

    在更新目前的粒子前,emitter调用preupdate()方法设置好所有动作。

    如,在即将来临的碰撞计算的这个阶段优化Collide(碰撞) 行动计算最大距离。

    注意,一个action动作可以有一个没做任何事情的preupdate()方法,对很多action都适用。

    6.  动作阶段:

    在这个阶段,发射器emitter询问所有他的action来更新在发射器粒子列表上的粒子,通过的方法是action的update()方法。

    注意,每个action都有priority属性。action都是通过这个属性来进行分类以及在分类列表上更新粒子。

    当然,每个action都有mask属性,action可以忽略并且不更新粒子(如果这个粒子的mask属性和动作的mask属性进行按位与之后的结果为0)。这对于一些一些粒子的特殊动作的伪装有用。一个粒子的mask值可以通过Mask的initializer进行初始化。

    7.  动作Postupate阶段:

    emitter调用所有action的postupdate()方法来结束更新(update)。

    注意,一个action可以有不做任何事情的postupdate()方法,对大部分action适用。

    8.  死亡的粒子的移除阶段:

    发射器会检测所有粒子的isDead属性来判断是否这个粒子死亡了。

    9. 死亡粒子的渲染阶段:

    所有的死亡的粒子都从发射器的粒子列表中移除。发射器emitter派发一个EmitterEvent.PARTICLES_REMOVED事件。renderer监听这个事件,并且这个事件将引用到renderer.paritclesRemoved()方法。这个方法负责移除死亡的粒子。

    如,DisplayObjectRenderer将死亡粒子的显示对象移除到显示对象容器列表中。

    翻译有误么???原文:

    For instance, the DisplayObjectRenderer removes the dead particles’ corresponding display objects to a display object container’s display list.

    10. 活动粒子的渲染阶段。

    在主循环结束派发最后一个事件(EmitterEvent.STEPPED)之前.

    这个事件会调用renderer.render()方法(主要负责引擎特效渲染)。

    如,DisplayObjectRenderer设置x, y, rotation, scaleX, scaleY, 以及存活的粒子其他属性,基于存储在emitter的粒子列表里的数字数据。

    经过我蹩脚的翻译之后,应该大致明白了星尘粒子系统主要是有什么作用以及基础结构了吧。

    转载请注明出处。3Q。

  • 相关阅读:
    memory consistency
    网页基础
    ECC
    RSA
    argparse模块
    009-MySQL循环while、repeat、loop使用
    001-mac搭建Python开发环境、Anaconda、zsh兼容
    013-在 Shell 脚本中调用另一个 Shell 脚本的三种方式
    012-Shell 提示确认(Y / N,YES / NO)
    014-docker-终端获取 docker 容器(container)的 ip 地址
  • 原文地址:https://www.cnblogs.com/holycy/p/stardustparticle.html
Copyright © 2020-2023  润新知