forked from: 宇宙 ParticlesSphere
@author zawa
/**
* Copyright zstone ( http://wonderfl.net/user/zstone )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/80Z9
*/
// forked from dubfrog's 宇宙 ParticlesSphere
package {
import flash.display.*;
import flash.events.*;
import flash.filters.BlurFilter;
import flash.geom.ColorTransform;
import caurina.transitions.*;
import caurina.transitions.properties.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.effects.BitmapLayerEffect;
import org.papervision3d.core.geom.Pixels;
import org.papervision3d.materials.special.ParticleMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.objects.special.ParticleField;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.layer.BitmapEffectLayer;
import org.papervision3d.view.Viewport3D;
/* @author zawa */
[SWF(width = "465", height = "465", backgroundColor = "0", fps = "30")]
public class Main extends Sprite {
private var scene:Scene3D;
private var camera:Camera3D;
private var viewport:Viewport3D;
private var render:BasicRenderEngine;
private var rootNode:DisplayObject3D;
private var bfm:BitmapEffectLayer;
private var coltrans:ColorTransform;
private var cameraBool:Boolean;
private var cametaPos:Object;
private var angle:Number;
public function Main():void {
createWorld();
stage.addEventListener(MouseEvent.CLICK, changeView)
}
private function createWorld():void {
scene = new Scene3D();
viewport = new Viewport3D(0, 0, true, false);
addChild(viewport);
rootNode = new DisplayObject3D();
scene.addChild(rootNode);
camera = new Camera3D();
camera.z = -camera.focus * camera.zoom;
render = new BasicRenderEngine();
var sphere:Sphere = new Sphere(new WireframeMaterial(0xFFFFFF, 100, 1), 100, 180, 12);
var vmax:Number = sphere.geometry.vertices.length - 1;
var mat:ParticleMaterial = new ParticleMaterial(0xFFFFFF, 10, 1);
var particles:ParticleField = new ParticleField(mat, vmax*1, 3, 1000, 1000, 1000);
bfm = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight, true, 0, "clear_pre",false,false );
bfm.addEffect(new BitmapLayerEffect(new BlurFilter(10, 10, 3), false));
bfm.drawCommand.blendMode = BlendMode.ADD
viewport.containerSprite.addLayer(bfm);
bfm.addDisplayObject3D(particles);
coltrans = new ColorTransform(0,0,0,1,0,0,0,0);
rootNode.addChild(particles)
for (var i:Number = 0; i <= vmax; i++) {
var gx:Number = sphere.geometry.vertices[i].x;
var gy:Number = sphere.geometry.vertices[i].y;
var gz:Number = sphere.geometry.vertices[i].z;
Tweener.addTween(particles.geometry.vertices[i], { x:gx, y:gy, z:gz, delay:i*.005,time:20, transition:"easeInOutExpo" } );
}
angle = 0;
cameraBool = true;
cametaPos = { b: -camera.focus * camera.zoom, f:-camera.focus * camera.zoom + 150 };
startRendering();
}
private function startRendering():void {
addEventListener(Event.ENTER_FRAME, update);
}
//Rendering...
private function update(e:Event):void{
render.renderScene(scene, camera, viewport);
rootNode.rotationY+=.1;
rootNode.rotationX+=.1;
rootNode.rotationZ+=.1;
angle+=0.01;
var sin:Number = Math.sin(angle)
var cos:Number = Math.cos(angle)
if (sin < .1) sin = Math.abs(sin)+.1;
if (cos < .1) cos = Math.abs(cos)+.1;
coltrans.redMultiplier = sin/4;
coltrans.greenMultiplier = cos/2;
coltrans.blueMultiplier = sin;
bfm.drawCommand.colorTransform = coltrans;
}
//MouseEvent...
private function changeView(e:MouseEvent) :void {
Tweener.removeTweens(camera);
if (cameraBool) {
cameraBool = false;
Tweener.addTween(camera, { z:cametaPos.f, time:10, transition:"easeInOutQuard" } );
}else {
cameraBool = true;
Tweener.addTween(camera, { z:cametaPos.b, time:10, transition:"easeInOutQuard" } );
}
}
}
}