
Stardust Particle Engine
El término Sistema de Partículas hace referencia a una técnica de gráficos de computadora para simular ciertos fenómenos difusos que son de otra manera muy difícil de reproducir con técnicas convencionales de rendering.
Entro los ejemplos de estos fenómenos que suelen reproducirse utilizando sistemas de partículas tenemos fuego, explosiones, humo, agua en movimiento, chispas, hojas que caen, nubes, niebla, polvo, colas de meteoros, pelo, piel, pasto... o efectos visuales abstractos como rastros brillantes, hechizos de magia, etc.
La mayoría de las veces los sistemas de partículas son implementados en sistemas gráficos de tres dimensiones, pero también se puede usar estos sistemas de partículas en dos dimensiones.
Stardust Particle Engine fue inspirado en otras dos excelentes librerías que son Flint Particle System y Box2D Physics Engine, además también heredó la estructura de clases de Emitter, un antiguo proyecto de este mismo autor.
Entre las principales características tenemos:
- Supports 2D and 3D particle effects.
- Easy to extend for custom initializers, actions, fields, deflectors, clocks, and 2D/3D renderers.
- Includes 3D extensions for ZedBox, Papervision3D, Flare3D,and ND3D.
- Includes a native 3D renderer.
- Supports particle masking (particles can be affected by selected actions).
- Uses fast-splicing arrays and object pools to improve performance.
- Gravity and deflector simulation.
- Action triggers (for creating complex conditional particle behaviors).
- XML serialization.
En la página oficial se puede encontrar varios ejemplos, este es un pequeño código para un ejemplo básico que se puede encontrar junto con el manual.
import idv.cjcat.stardust.common.actions.*; import idv.cjcat.stardust.common.clocks.*; import idv.cjcat.stardust.common.initializers.*; import idv.cjcat.stardust.common.math.*; import idv.cjcat.stardust.twoD.actions.*; import idv.cjcat.stardust.twoD.emitters.*; import idv.cjcat.stardust.twoD.initializers.*; import idv.cjcat.stardust.twoD.renderers.*; import idv.cjcat.stardust.twoD.zones.*; stage.scaleMode = StageScaleMode.NO_SCALE; root.scrollRect = new Rectangle(0, 0, 300, 300); var emitter:Emitter2D = new Emitter2D(new SteadyClock(1)); var sprite:Sprite = new Sprite(); addChild(sprite); var renderer:DisplayObjectRenderer = new DisplayObjectRenderer(sprite); renderer.addEmitter(emitter); var displayObjectClass:DisplayObjectClass = new DisplayObjectClass(RainDrop); var position:Position = new Position(new Line(0, 0, 300, 0)); var velocity:Velocity = new Velocity(new SinglePoint(0, 5)); emitter.addInitializer(displayObjectClass); emitter.addInitializer(position); emitter.addInitializer(velocity); var move:Move = new Move(); var deathZone:DeathZone = new DeathZone(new RectZone(0, 0, 300, 300), true); emitter.addAction(move); emitter.addAction(deathZone); var drift:RandomDrift = new RandomDrift(); drift.randomX = new UniformRandom(0.1, 0); var oriented:Oriented = new Oriented(); oriented.offset = 180; emitter.addAction(drift); emitter.addAction(oriented); addEventListener(Event.ENTER_FRAME, emitter.step);
Y el resultado obtenido sería el siguiente:
