forcemap(基本)

今回はforcemapです。
これは色を使ってアニメーションを表現する技法です。
自然的な表現をするときに使います。

色の表現 (map)

結果

ソース

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BitmapDataChannel;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.BlurFilter;
	import flash.geom.ColorTransform;
	import flash.geom.Rectangle;
	
	[SWF(width="500",height="500",backgroundColor="0")]
	public class particle5 extends Sprite
	{
		private var bmpd:BitmapData;
		private var forcemap:BitmapData;
		private var bmp:Bitmap;
		private var colortf:ColorTransform;
		private var particles:Vector.<Particle>;
		private var blur:BlurFilter = new BlurFilter(4,4,1);
		
		public function particle5()
		{
			bmpd = new BitmapData(500,500,false,0);
			forcemap = new BitmapData(500,500,false,0);
			
			bmp = new Bitmap(bmpd);
			addChild(bmp);
			
			//残像
			colortf = new ColorTransform(0,.7,.99,.9);
			onMouseClick();
			addEventListener(Event.ENTER_FRAME,onEnterFrame);
			stage.addEventListener(MouseEvent.CLICK,onMouseClick);
		}
		
		private function onEnterFrame(e:Event):void{
			bmpd.colorTransform(new Rectangle(0,0,500,500),colortf);
			bmpd.applyFilter(bmpd,bmpd.rect,bmpd.rect.topLeft,blur); 
			
			var len:Number = particles.length;
			
			while(len--){
				var p:Particle = particles[len];
				//色のピクセルを取得
				var color:Number = forcemap.getPixel(p.xx,p.yy);
				//赤
				var r:int = color >> 16 & 0xff;
				//緑
				var g:int = color >> 8 & 0xff;
				p.ax = (r-128)*0.007;
				p.ay = (g-128)*0.007;
				p.vx += p.ax;
				p.vy += p.ay;
				p.xx += p.vx;
				p.yy += p.vy;
				
				p.ax *= 0.98;
				p.ay *= 0.98;
				p.vx *= 0.93;
				p.vy *= 0.93;
				
				//はみ出した時の処理
				if(p.xx < 0) p.xx = 500+p.xx;
				else if(p.xx >= 500) p.xx = p.xx-500;
				if(p.yy < 0) p.yy = 500+p.yy;
				else if(p.yy >= 500) p.yy = p.yy-500;
				
				bmpd.fillRect(new Rectangle(p.xx,p.yy,1,1),0x00ffff);
			}
		}
		
		private function onMouseClick(e:MouseEvent = null):void{
			particles = new Vector.<Particle>;
			for(var i:int=0;i<8000;i++){
				var p:Particle = new Particle();
				p.xx = Math.random()*500;
				p.yy = Math.random()*500;
				p.vx = p.vy = p.ax = p.ay = 0;
				particles.push(p);
			}
			forcemap.perlinNoise(500,500,4,Math.floor(Math.random()*0xffffff),false,true,BitmapDataChannel.RED|BitmapDataChannel.GREEN|0|0);
		}
	}
}

class Particle{
	public var xx:Number;
	public var yy:Number;
	public var vx:Number;
	public var vy:Number;
	public var ax:Number;
	public var ay:Number;
}

完成結果
http://about-hiroppy.com/flash/work/particle2/