Beautifl - Flash Gallery

Thumbnail : ParticleGirl !?
ParticleGirl !?
Hidetaro 2010-01-02 MIT License

再生するにはFlash Playerが必要です。デスクトップのブラウザでご覧ください。

package {
	import flash.display.Sprite;
	import flash.events.*;
	import flash.filters.BlurFilter;
	import flash.net.*;

	import org.papervision3d.view.layer.*;
	import org.papervision3d.core.geom.Pixels;
	import org.papervision3d.core.geom.renderables.*;
	import org.papervision3d.core.effects.*;
	import org.papervision3d.core.effects.utils.*;
	import org.papervision3d.view.BasicView;
	[SWF(width="465", height="465", backgroundColor="0x000000", frameRate="60")]

	public class ParticleGirl extends BasicView {
		private var xml:XML;
		private var hairPixels:Pixels;
		private var oppaiPixels:Pixels;
		private var bodyPixels:Pixels;
		private var vartexData_hair:Vector.<MyParticles> = new Vector.<MyParticles>();
		private var vartexData_oppai:Vector.<MyParticles> = new Vector.<MyParticles>();
		private var vartexData_body:Vector.<MyParticles> = new Vector.<MyParticles>();
		private var op:Oppai = new Oppai();
		private var spring:Number=0.1;
		private var friction:Number=0.90;

		public function ParticleGirl():void {
			super(0, 0, true, true);
			var xmlLoader:URLLoader = new URLLoader();
			xmlLoader.load(new URLRequest("http://www.akibahideki.com/particle_data/bodydata.dat"));
			xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
			camera.z=-1000;
			var layer:BitmapEffectLayer=new BitmapEffectLayer(viewport,550,400,true,0,BitmapClearMode.CLEAR_PRE,true);
			viewport.containerSprite.addLayer(layer);
			layer.addEffect(new BitmapLayerEffect(new BlurFilter(8, 8, 4), false));
			hairPixels=new Pixels(layer);
			oppaiPixels=new Pixels(layer);
			bodyPixels=new Pixels(layer);
			scene.addChild(hairPixels);
			scene.addChild(bodyPixels);
			scene.addChild(oppaiPixels);
			scene.addChild(op);
			op.localRotationY=hairPixels.localRotationY=bodyPixels.localRotationY=oppaiPixels.localRotationY=-180;
		}

		private function xmlLoaded(e:Event):void {
			xml=XML(e.target.data);
			//Make a Hair
			var ar:Array=xml.float_array[1].split("\n");
			for (var i:uint = 0; i<ar.length; i++) {
				var oneVartex:Array=ar[i].split(" ");
				vartexData_hair.push(setParticles(oneVartex));
			}
			drawParticle(vartexData_hair, hairPixels);
			//Make an Oppai
			var ar2:Array=xml.float_array[2].split("\n");
			for (var i2:uint = 0; i2<ar2.length; i2++) {
				var oneVartex2:Array=ar2[i2].split(" ");
				vartexData_oppai.push(setParticles(oneVartex2));
			}
			drawParticle(vartexData_oppai, oppaiPixels);
			//Make a Body
			var ar3:Array=xml.float_array[0].split("\n");
			for (var i3:uint = 0; i3<ar3.length; i3++) {
				var oneVartex3:Array=ar3[i3].split(" ");
				vartexData_body.push(setParticles(oneVartex3));
			}
			drawParticle(vartexData_body, bodyPixels);
			addEventListener(Event.ENTER_FRAME,enterFrames);
		}

		private function setParticles(oneVartex:Array):MyParticles {
			var particle:MyParticles = new MyParticles();
			particle.x=oneVartex[0]*5000;
			particle.y=oneVartex[1]*5000-800;
			particle.z=oneVartex[2]*5000;
			particle.color=0xffff99cc;
			return particle;
		}

		private function drawParticle(vertexes:Vector.<MyParticles>, pixels_obj:Pixels):void {
			var len:uint=vertexes.length;
			var px:MyParticles;
			for (var i:uint = 0; i<len; i++) {
				px=vertexes[i];
				var p:Pixel3D=new Pixel3D(px.color);
				p.x=px.x;
				p.y=px.y;
				p.z=px.z;
				if (pixels_obj==oppaiPixels) {//Oppaiなら
					op.oppaiPosition.push(new Array(p.x,p.y,p.z));
				}
				pixels_obj.addPixel3D(p);
			}
		}

		private function enterFrames(event:Event):void {
			allRotation(new Array(hairPixels,oppaiPixels,bodyPixels,op));
			oppaiHandler(vartexData_oppai);
			startRendering();
		}

		private function oppaiHandler(vec:Vector.<MyParticles>):void {
			var particle:MyParticles;
			for (var i:uint = 0; i<vec.length; i++) {
				particle=vec[i];
				var dx:Number=(op.getRotationPoint(i).x)-particle.x;
				var dy:Number=(op.getRotationPoint(i).y)-particle.y;
				var ax:Number=dx*(spring*((1)*0.090+(i*0.001)));//ここで調節
				var ay:Number=dy*(spring*((1)*0.090+(i*0.001)));
				particle.vx+=ax;
				particle.vy+=ay;
				particle.vx*=friction;
				particle.vy*=friction;
				particle.x+=particle.vx;
				particle.y+=particle.vy;
				oppaiPixels.pixels[i].x=particle.x;
			}
		}

		private function allRotation(ar:Array):void {
			var i:uint=ar.length;
			while (i--) {
				ar[i].rotationY += (mouseX-stage.stageWidth/2)*0.01;
				ar[i].rotationX += (mouseY-stage.stageHeight/2)*0.01;
			}
		}

		private function rand(num:Number):int {
			return Math.floor(Math.random()*num);
		}
	}
}

class MyParticles {
	public var x:Number,y:Number,z:Number,vx:Number=0,vy:Number=0,vz:Number=0,color:uint;
}

import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.core.math.Number3D;

class Oppai extends DisplayObject3D {
	public var oppaiPosition:Array=[];
	public function getRotationPoint(index:uint):Number3D {
		var newX:Number=Math.cos(degreeToRadian(rotationY))*oppaiPosition[index][0];
		var newY:Number=Math.cos(degreeToRadian(rotationZ))*oppaiPosition[index][1];
		var newZ:Number=Math.sin(degreeToRadian(rotationY))*oppaiPosition[index][2];
		return new Number3D(newX,newY,newZ);
	}

	private function degreeToRadian(rote:Number):Number {
		return rote*Math.PI / 180;
	}
}