package { import flash.display.Sprite; import flash.display.LineScaleMode; import flash.events.MouseEvent; import flash.geom.PerspectiveProjection; import flash.geom.Utils3D; import flash.geom.Vector3D; import flash.geom.Matrix3D; import flash.geom.*; import flash.events.Event; import flash.utils.Dictionary; [SWF(backgroundColor="0x000000", width="800", height="600", frameRate="30")] public class Dandelion2 extends Sprite { var vertices:Vector. = new Vector.(); var pvts:Vector. = new Vector.(); var spores:Vector. = new Vector.(); var sporesDct:Dictionary = new Dictionary(true); public function Dandelion2(){ for(var lat:Number= 0, long:Number= 0; lat < Math.PI; lat+=0.01,long+=0.5){ vertices.push( 10*Math.cos(long)*Math.sin(lat), 10*Math.cos(lat), 10*Math.sin(long)*Math.sin(lat), 70*Math.cos(long)*Math.sin(lat), 70*Math.cos(lat), 70*Math.sin(long)*Math.sin(lat), (70 + 10)*Math.cos(long-Math.random()*0.1)*Math.sin(lat-Math.random()*0.05), (70 + 10)*Math.cos(lat-Math.random()*0.05), (70 + 10)*Math.sin(long-Math.random()*0.1)*Math.sin(lat-Math.random()*0.05), (70 + 10)*Math.cos(long+Math.random()*0.1)*Math.sin(lat-Math.random()*0.05), (70 + 10)*Math.cos(lat-Math.random()*0.05), (70 + 10)*Math.sin(long+Math.random()*0.1)*Math.sin(lat-Math.random()*0.05), (70 + 10)*Math.cos(long+Math.random()*0.1)*Math.sin(lat+Math.random()*0.05), (70 + 10)*Math.cos(lat+Math.random()*0.05), (70 + 10)*Math.sin(long+Math.random()*0.1)*Math.sin(lat+Math.random()*0.05), (70 + 10)*Math.cos(long-Math.random()*0.1)*Math.sin(lat+Math.random()*0.05), (70 + 10)*Math.cos(lat+Math.random()*0.05), (70 + 10)*Math.sin(long-Math.random()*0.1)*Math.sin(lat+Math.random()*0.05)); var spore:Sprite = new Sprite(); spore.transform.matrix = new Matrix(1,0,0,1,stage.stageWidth/2,stage.stageHeight/2); spores.push(spore); addChild(spore); sporesDct[spore] = { zp:70*Math.sin(long)*Math.sin(lat), firstVertex: vertices.length-18, lastVertex: vertices.length-1, blown: false, xv:Math.random()*2 - 1, yv:Math.random()*2 - 1, zv:Math.random()*2 - 1, xr:Math.random()*2 - 1, yr:Math.random()*2 - 1, zr:Math.random()*2 - 1 }; spore.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void { sporesDct[event.target]["blown"]=true; }); } addEventListener(Event.ENTER_FRAME, function(event:Event):void { var m:Matrix3D = new PerspectiveProjection().toMatrix3D(); m.prependTranslation(0,0,10); //move spores spores.forEach(function(spore:Sprite, ind:int, a:Vector.):void { var verts:Vector. = vertices.slice(sporesDct[spore].firstVertex,sporesDct[spore].lastVertex+1); var spv:Vector. = new Vector.(); var m2:Matrix3D = new Matrix3D(); if(sporesDct[spore].blown){ m2.appendTranslation(sporesDct[spore].xv,sporesDct[spore].yv,sporesDct[spore].zv); m2.appendRotation(sporesDct[spore].xr,Vector3D.X_AXIS); m2.appendRotation(sporesDct[spore].yr,Vector3D.Y_AXIS); m2.appendRotation(sporesDct[spore].zr,Vector3D.Z_AXIS); }else{ m2.appendRotation(1, Vector3D.Y_AXIS); } m2.transformVectors(verts,spv); vertices.splice(sporesDct[spore].firstVertex,18,spv[0],spv[1],spv[2],spv[3],spv[4],spv[5],spv[6],spv[7],spv[8],spv[9],spv[10],spv[11],spv[12],spv[13],spv[14],spv[15],spv[16],spv[17]); }); Utils3D.projectVectors(m, vertices, pvts, Vector.([])); for(var i:int = 0; i < pvts.length; i+=12){ //var spore:Sprite = spores[i/12]; spores[i/12].graphics.clear(); spores[i/12].graphics.lineStyle((100 - 2*sporesDct[spores[i/12]].zp)/100,0xFFFFFF); spores[i/12].graphics.drawPath(Vector.([1,2,2,1,2,1,2,1,2]),Vector.([ pvts[i],pvts[i+1], pvts[i+2],pvts[i+3], pvts[i+4],pvts[i+5], pvts[i+2],pvts[i+3], pvts[i+6],pvts[i+7], pvts[i+2],pvts[i+3], pvts[i+8],pvts[i+9], pvts[i+2],pvts[i+3], pvts[i+10],pvts[i+11]])); } }); } } } // Copyright (c) 2008 David Wilhelm // MIT license: http://www.opensource.org/licenses/mit-license.php