Beautifl - Flash Gallery

Preview

ParticleGirl !?
Hidetaro 2010年1月2日 MIT License
?
      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;
    }
}