Beautifl - Flash Gallery

Thumbnail : Thurs grow 3D(伸びてゆく木 PV3D)
Thurs grow 3D(伸びてゆく木 PV3D)
OKASUKE 2010-06-29 MIT License

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

/**
 * Thurs grow 3D(伸びてゆく木 PV3Dバーション)
 * 枝の成長する順番もシンメトリーにするように考えんといかん・・・ぬぅ
 * 2010/06/29 OKASUKE 
 * 木が完成するまで約60秒、消えるまで約60秒かかります。
 * 
 */
package  
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;	
	
	import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.view.BasicView;
    import org.papervision3d.render.BasicRenderEngine;
    
	import org.papervision3d.materials.special.LineMaterial;
	import org.papervision3d.core.geom.Lines3D;
	import org.papervision3d.core.geom.renderables.Line3D;
	import org.papervision3d.core.utils.Mouse3D;
	
	import org.libspark.betweenas3.easing.*;
	import org.libspark.betweenas3.BetweenAS3;
    import org.libspark.betweenas3.tweens.ITween;    
	import org.libspark.betweenas3.events.TweenEvent;    
    import net.hires.debug.Stats;
  	
	public class WonTest extends BasicView
	{
		private var _lineMat:LineMaterial = new LineMaterial(0x000000, 1);	
		private var _line1:Lines3D = new Lines3D(_lineMat);	
		private var _baseline:Lines3D = new Lines3D(_lineMat);
	
		private var _N:uint = 6;
		private var _point1X:Number = 0;
		private var _point1Y:Number = -200;
		private var _point1Z:Number = 0;
	
		private var _leng:Number = 100;
		private var _angle:Number = 90;		
		private var _scale:Number = 1.2;
		private var _branch:Number = 20;
		
		private var _t:ITween;

private static const _PI:Number = Math.PI / 180;
		
		public function WonTest() 
		{			
			base();
			tree(_N, _point1X, _point1Y, _point1Z, _leng, _angle);
		
						
			var num:uint = _line1.lines.length;
            var arrtweens:Array = new Array(num);
			var sx:Number = 0, sy:Number = 0, sz:Number = 0;
			var ex:Number = 0, ey:Number = 0, ez:Number = 0;
            for (var i:uint = 0; i < num; ++i) {
				var line:Line3D = _line1.lines[i];				
				sx = line.v0.x, sy = line.v0.y, sz = line.v0.z;
				//ex = line.v1.x, ey = line.v1.y, ez = line.v1.z;
				
				var lines1:Lines3D = new Lines3D();
				scene.addChild(lines1);				
				lines1.addLine(line);
                arrtweens[i] = BetweenAS3.delay(BetweenAS3.tween(lines1, null, { x:sx, y:sy, z:sz, scaleX:0, scaleY:0, scaleZ:0}, 0.3, Quint.easeInOut), 0.4 + 0.2 * i);
            }
            var it:ITween = BetweenAS3.parallelTweens(arrtweens);
                
            _t = BetweenAS3.serial(
                it,
                BetweenAS3.delay(BetweenAS3.reverse(it), 3)
            );
            
			_t.play();			
			//addChild(new Stats());

                            Wonderfl.capture_delay(62);
			addEventListener(Event.ENTER_FRAME, loop);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, mdown);			
			startRendering();			
		}
			
		private function base():void {
			_baseline.addNewLine(1, 0, -200, 0, 100, -200,  0);	
			_baseline.addNewLine(1, 100, -200, 0, 100, -200, 100);
			_baseline.addNewLine(1, 100, -200, 100, 0, -200, 100);
			_baseline.addNewLine(1, 0, -200, 100, 0, -200, 0);
			_baseline.x -= 50;
			_baseline.z -= 50;		
			scene.addChild(_baseline);
		}
		
		private var _rot:Number = 0;
		private function loop(e:Event = null):void {			
			_rot += 1.2;			
			camera.x = 500 * Math.sin(_rot * Math.PI / 180);
			camera.z = 500 * Math.cos(_rot * Math.PI / 180);			
		}
		
		private function mdown(e:Event):void {
			removeEventListener(Event.ENTER_FRAME, loop);
			stage.addEventListener(MouseEvent.MOUSE_UP, mup);
		}
		
		private function mup(e:Event):void {
			removeEventListener(MouseEvent.MOUSE_UP, mup);
			addEventListener(Event.ENTER_FRAME, loop);
		}
		
		private function tree(n:Number, x0:Number, y0:Number, z0:Number, leng:Number, angle:Number):void {
			
			if (n <= 0)
				return;
			
			var x:Number = x0 + leng * (Math.cos(angle * _PI));
            var y:Number = y0 + leng * (Math.sin(angle * _PI));
			var z:Number = z0 + leng * (-Math.cos(angle * _PI));				
			if (n == _N && n % 2 == 0) {				
				drawLine3D(1, x0, y0, z0, x, y, z);				
			} else {	
								
				drawLine3D(1, x0, y0, z0, x, y, z);	
				//treeZ(n, x0, y0, z0, leng, angle);//カスタマイズ用
				treeY(n, x0, y0, z0, leng, angle);	
			}
			
			n -= 1;
			tree(n, x, y, z, leng/_scale, angle - _branch);
			tree(n, x, y, z, leng/_scale, angle + _branch);			
		}	
		
		private function treeZ(n:Number, x0:Number, y0:Number, z0:Number, leng:Number, angle:Number):void {
			if (n <= 0)
				return;
			
			var x:Number = x0 + leng * (Math.cos(angle * _PI));
            var y:Number = y0 + leng * (Math.sin(angle * _PI));
			var z:Number = z0 + leng * (Math.cos(angle * _PI));			
			
			_line1.addNewLine(1, x0, y0, z0, x, y, z);
			n -= 1;
			treeZ(n, x, y, z, leng/_scale, angle-_branch);
			treeZ(n, x, y, z, leng/_scale, angle+_branch);			
		}
		
		private function treeY(n:Number, x0:Number, y0:Number, z0:Number, leng:Number, angle:Number):void {
			if (n <= 0)
				return;
			
			var x:Number = x0 - leng * (Math.cos(angle * _PI));
            var y:Number = y0 + leng * (Math.sin(angle * _PI));
			var z:Number = z0 - leng * (Math.cos(angle * _PI));			
			//Lineの太さは1とする
			_line1.addNewLine(1, x0, y0, z0, x, y, z);
			n -= 1;
			treeY(n, x, y, z, leng/_scale, angle-_branch);
			treeY(n, x, y, z, leng/_scale, angle+_branch);			
		}		
		
		private function drawLine3D(n:Number, x0:Number, y0:Number, z0:Number, x:Number, y:Number, z:Number):void {
			//Line太さは1としているn=1
			_line1.addNewLine(n, x0, y0, z0, x, y, z);			
		}
		
		override protected function onRenderTick(event:Event = null):void {						
			super.onRenderTick(event);
		}		
	}	
}