Brownian Motion

Flash required: You need version 9 or later of the free Flash player from Adobe to use this content. To download and install the free player from Adobe's web site click here.

This example simulates Brownian Motion. It demonstrates Flint’s built-in collision handling between particles.

The example also includes a custom action created to show and hide the air particles.

package
{
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.geom.Point3D;
  import org.flintparticles.threeD.renderers.DisplayObjectRenderer;
  import org.flintparticles.threeD.renderers.controllers.OrbitCamera;

  import flash.display.Sprite;
  import flash.text.TextField;

  [SWF(width='400', height='400', frameRate='61', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var emitter:Emitter3D;
    private var orbitter:OrbitCamera;
    
    public function Main()
    {
      var txt:TextField = new TextField();
      txt.text = "Hold down the shift key to hide the air particles.";
      txt.autoSize = "left";
      txt.textColor = 0xFFFFFF;
      addChild( txt );

      emitter = new BrownianMotion( stage );

      var renderer:DisplayObjectRenderer = new DisplayObjectRenderer();
      renderer.x = 200;
      renderer.y = 200;
      renderer.addEmitter( emitter );
      addChild( renderer );
      
      renderer.camera.position = new Point3D( 0, 0, -400 );
      renderer.camera.target = new Point3D( 0, 0, 0 );
      renderer.camera.projectionDistance = 400;
      orbitter = new OrbitCamera( stage, renderer.camera );
      orbitter.start();

      emitter.start();
    }
  }
}
package
{
  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.displayObjects.Dot;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.ColorInit;
  import org.flintparticles.common.initializers.ImageClass;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.geom.Point3D;
  import org.flintparticles.threeD.geom.Vector3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;

  import flash.display.DisplayObject;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 250 );
      
      var air:InitializerGroup = new InitializerGroup();
      air.addInitializer( new ImageClass( Dot, 2 ) );
      air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      smoke.addInitializer( new ImageClass( Dot, 10 ) );
      smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Point3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Point3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 19, 1 ] ) );
      
      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
import org.flintparticles.common.counters.*;
import org.flintparticles.common.displayObjects.Dot;
import org.flintparticles.common.initializers.*;
import org.flintparticles.threeD.actions.*;
import org.flintparticles.threeD.emitters.Emitter3D;
import org.flintparticles.threeD.geom.Point3D;
import org.flintparticles.threeD.geom.Vector3D;
import org.flintparticles.threeD.initializers.*;
import org.flintparticles.threeD.renderers.*;
import org.flintparticles.threeD.renderers.controllers.OrbitCamera;
import org.flintparticles.threeD.zones.*;  

var txt:TextField = new TextField();
txt.text = "Hold down the shift key to hide the air particles.";
txt.autoSize = "left";
txt.textColor = 0xFFFFFF;
addChild( txt );

var emitter:Emitter3D = new Emitter3D();
emitter.counter = new Blast( 250 );

var air:InitializerGroup = new InitializerGroup();
air.addInitializer( new ImageClass( Dot, 2 ) );
air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) );
air.addInitializer( new MassInit( 1 ) );
air.addInitializer( new CollisionRadiusInit( 2 ) );

var smoke:InitializerGroup = new InitializerGroup();
smoke.addInitializer( new ImageClass( Dot, 10 ) );
smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) );
smoke.addInitializer( new MassInit( 5 ) );
smoke.addInitializer( new CollisionRadiusInit( 10 ) );

emitter.addInitializer( new Position( new BoxZone( 280, 280, 280, new Point3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
emitter.addInitializer( new Velocity( new SphereZone( new Point3D( 0, 0, 0 ), 150, 100 ) ) );
emitter.addInitializer( new ChooseInitializer( [ air, smoke ], [ 19, 1 ] ) );

emitter.addAction( new Move() );
emitter.addAction( new Collide( 1 ) );
emitter.addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
emitter.addAction( new ShowAirAction( stage ) );

var renderer:DisplayObjectRenderer = new DisplayObjectRenderer();
renderer.x = 200;
renderer.y = 200;
renderer.addEmitter( emitter );
addChild( renderer );

renderer.camera.position = new Point3D( 0, 0, -400 );
renderer.camera.target = new Point3D( 0, 0, 0 );
renderer.camera.projectionDistance = 400;
var orbitter:OrbitCamera = new OrbitCamera( stage, renderer.camera );
orbitter.start();

emitter.start();
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
  xmlns:mx="http://www.adobe.com/2006/mxml"
  xmlns:f="http://flintparticles.org/2009/flint3d"
  xmlns:local="*"
  layout="absolute" width="500" height="500"
  backgroundColor="#000000">

  <mx:Script>
    <![CDATA[
      import org.flintparticles.common.displayObjects.Dot;
    ]]>
  </mx:Script>

<mx:Label text="Hold down the shift key to hide the air particles." color="0xFFFFFF"/>
<f:DisplayObjectRenderer id="renderer" width="500" height="500">
  <f:camera>
    <f:Camera projectionDistance="400">
      <f:position>
        <f:Point3D x="0" y="0" z="-400"/>
      </f:position>
    </f:Camera>
  </f:camera>
  <f:emitters>
    <f:Emitter id="emitter" autoStart="true">
      <f:counter>
        <f:Blast startCount="250"/>
      </f:counter>
      <f:initializers>
        <f:Position>
          <f:BoxZone width="280" height="280" depth="280"/>
        </f:Position>
        <f:Velocity>
          <f:SphereZone innerRadius="100" outerRadius="150"/>
        </f:Velocity>
        <f:ChooseInitializer weights="1,19">
          <f:InitializerGroup>
            <f:ImageClass imageClass="{Dot}" parameters="10"/>
            <f:CollisionRadiusInit radius="10"/>
            <f:MassInit mass="5"/>
            <f:ColorInit minColor="0xFFFFFFFF" maxColor="0xFFFFFFFF"/>
          </f:InitializerGroup>
          <f:InitializerGroup>
            <f:ImageClass imageClass="{Dot}" parameters="2"/>
            <f:CollisionRadiusInit radius="2"/>
            <f:MassInit mass="1"/>
            <f:ColorInit minColor="0xFF666666" maxColor="0xFF666666"/>
          </f:InitializerGroup>            
        </f:ChooseInitializer>
      </f:initializers>
      <f:actions>
        <f:Move/>
        <f:Collide bounce="1"/>
        <f:BoundingBox minX="-150" maxX="150" minY="-150" maxY="150" minZ="-150" maxZ="150"/>
        <local:ShowAirAction/>
      </f:actions>
    </f:Emitter>
  </f:emitters>
</f:DisplayObjectRenderer>
</mx:Application>
package
{
  import flash.display.DisplayObject;
  import flash.events.Event;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;
  
  import mx.core.IMXMLObject;
  
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;  

  

  public class ShowAirAction extends ActionBase implements IMXMLObject
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction()
    {
      _isDown = false;
    }
    
    public function initialized( document:Object, id:String ):void
    {
      if( document.stage )
      {
        setStage( document.stage );
      }
      else
      {
        DisplayObject( document ).addEventListener( Event.ADDED_TO_STAGE, addedToStage );
      }
    }
      
    private function addedToStage( ev:Event ):void
    {
      setStage( ev.target.stage );
    }  
    
    private function setStage( stage:DisplayObject ):void
    {
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
package
{
  import away3d.containers.View3D;

  import org.flintparticles.threeD.away3d.Away3DRenderer;
  import org.flintparticles.threeD.emitters.Emitter3D;

  import flash.display.Sprite;
  import flash.events.Event;

  [SWF(width='400', height='400', frameRate='61', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var emitter:Emitter3D;
    private var view:View3D;
    private var renderer:Away3DRenderer;
    
    public function Main()
    {
      emitter = new BrownianMotion( stage );

      view = new View3D({x:200,y:200});
      addChild(view);
      renderer = new Away3DRenderer( view.scene );
      renderer.addEmitter( emitter );

      emitter.start();
      
      addEventListener( Event.ENTER_FRAME, render, false, 0, true );
    }
    
    private function render( ev:Event ):void
    {
      // render the view
      view.render();
    }
  }
}
package
{
  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.displayObjects.Dot;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.ColorInit;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.away3d.initializers.A3DDisplayObjectClass;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.geom.Point3D;
  import org.flintparticles.threeD.geom.Vector3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;

  import flash.display.DisplayObject;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 250 );
      
      var air:InitializerGroup = new InitializerGroup();
      air.addInitializer( new A3DDisplayObjectClass( Dot, 2 ) );
      air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      smoke.addInitializer( new A3DDisplayObjectClass( Dot, 10 ) );
      smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Point3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Point3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 19, 1 ] ) );
      
      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}
package
{
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.papervision3d.PV3DParticleRenderer;
  import org.papervision3d.cameras.Camera3D;
  import org.papervision3d.core.geom.Particles;
  import org.papervision3d.render.BasicRenderEngine;
  import org.papervision3d.scenes.Scene3D;
  import org.papervision3d.view.Viewport3D;

  import flash.display.Sprite;
  import flash.events.Event;

  [SWF(width='400', height='400', frameRate='61', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var viewport:Viewport3D;
    private var emitter:Emitter3D;
    private var pv3dRenderer:BasicRenderEngine;
    private var flintRenderer:PV3DParticleRenderer;
    private var scene:Scene3D;
    private var camera:Camera3D;

    public function Main()
    {
      viewport = new Viewport3D( 400, 400 );
      addChild( viewport );
      
      pv3dRenderer = new BasicRenderEngine();
      scene = new Scene3D();
      camera = new Camera3D();
      camera.z = -400;
      
      var particles:Particles = new Particles();
      scene.addChild( particles );
      
      emitter = new BrownianMotion( stage );

      flintRenderer = new PV3DParticleRenderer( particles );
      flintRenderer.addEmitter( emitter );
      emitter.start();
      
      addEventListener( Event.ENTER_FRAME, render );
    }
    
    private function render( ev:Event ):void
    {
      // render the view
      pv3dRenderer.renderScene( scene, camera, viewport);
    }
  }
}
package
{
  import org.flintparticles.common.counters.Blast;
  import org.flintparticles.common.initializers.ChooseInitializer;
  import org.flintparticles.common.initializers.CollisionRadiusInit;
  import org.flintparticles.common.initializers.ColorInit;
  import org.flintparticles.common.initializers.InitializerGroup;
  import org.flintparticles.common.initializers.MassInit;
  import org.flintparticles.threeD.actions.BoundingBox;
  import org.flintparticles.threeD.actions.Collide;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.geom.Point3D;
  import org.flintparticles.threeD.geom.Vector3D;
  import org.flintparticles.threeD.initializers.Position;
  import org.flintparticles.threeD.initializers.Velocity;
  import org.flintparticles.threeD.papervision3d.initializers.ApplyMaterial;
  import org.flintparticles.threeD.papervision3d.initializers.PV3DObjectClass;
  import org.flintparticles.threeD.zones.BoxZone;
  import org.flintparticles.threeD.zones.SphereZone;
  import org.papervision3d.core.geom.renderables.Particle;
  import org.papervision3d.materials.special.ParticleMaterial;

  import flash.display.DisplayObject;

  public class BrownianMotion extends Emitter3D
  {
    public function BrownianMotion( stage:DisplayObject )
    {
      counter = new Blast( 250 );
      
      var air:InitializerGroup = new InitializerGroup();
      air.addInitializer( new PV3DObjectClass( Particle, null, 4 ) );
      air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) );
      air.addInitializer( new MassInit( 1 ) );
      air.addInitializer( new CollisionRadiusInit( 2 ) );
      air.addInitializer( new ApplyMaterial( ParticleMaterial, 0x666666, 1, ParticleMaterial.SHAPE_CIRCLE ) );
      
      var smoke:InitializerGroup = new InitializerGroup();
      smoke.addInitializer( new PV3DObjectClass( Particle, null, 20 ) );
      smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) );
      smoke.addInitializer( new MassInit( 5 ) );
      smoke.addInitializer( new CollisionRadiusInit( 10 ) );
      smoke.addInitializer( new ApplyMaterial( ParticleMaterial, 0xFFFFFF, 1, ParticleMaterial.SHAPE_CIRCLE ) );
      
      addInitializer( new Position( new BoxZone( 280, 280, 280, new Point3D( 0, 0, 0 ), new Vector3D( 0, 1, 0 ), new Vector3D( 0, 0, 1 ) ) ) );
      addInitializer( new Velocity( new SphereZone( new Point3D( 0, 0, 0 ), 150, 100 ) ) );
      
      addInitializer( new ChooseInitializer( [ air, smoke ], [ 19, 1 ] ) );
      
      addAction( new Move() );
      addAction( new Collide( 1 ) );
      addAction( new BoundingBox( -150, 150, -150, 150, -150, 150, 1 ) );
      addAction( new ShowAirAction( stage ) );
    }
  }
}
package
{
  import org.flintparticles.common.actions.ActionBase;
  import org.flintparticles.common.emitters.Emitter;
  import org.flintparticles.common.particles.Particle;

  import flash.display.DisplayObject;
  import flash.events.KeyboardEvent;
  import flash.ui.Keyboard;

  

  public class ShowAirAction extends ActionBase
  {
    private var _isDown:Boolean;
    
    
    public function ShowAirAction( stage:DisplayObject )
    {
      _isDown = false;
      stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true );
      stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true );
    }
    
    private function keyDownListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = true;
      }
    }
    private function keyUpListener( ev:KeyboardEvent ):void
    {
      if( ev.keyCode == Keyboard.SHIFT )
      {
        _isDown = false;
      }
    }

    
    override public function update( emitter:Emitter, particle:Particle, time:Number ):void
    {
      if( particle.mass == 1 )
      {
        if( _isDown )
        {
          particle.color = 0;
        }
        else
        {
          particle.color = 0xFF666666;
        }
      }
    }
  }
}