θυοιβ

ActionScript3
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

as3dmod+Away3d(3.6)

Posted on 2011-02-25 15:09  ichow  阅读(792)  评论(0)    收藏  举报
package 
{

	import away3d.cameras.Camera3D;
	import away3d.containers.ObjectContainer3D;
	import away3d.containers.View3D;
	import away3d.events.MouseEvent3D;
	import away3d.materials.BitmapMaterial;
	import away3d.materials.ColorMaterial;
	import away3d.primitives.Plane;
	import com.as3dmod.modifiers.Bend;
	import com.as3dmod.ModifierStack;
	import com.as3dmod.plugins.away3d.LibraryAway3d;
	import com.greensock.TweenLite;
	import com.greensock.easing.*
	import flash.display.BitmapData;
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.events.Event;
	import flash.filters.DropShadowFilter;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
	import flash.geom.Transform;

	/**
	 * ...
	 * @author iChow http://www.shootarea.com/iChow/blog
	 */

	[SWF(width="600",height="500")]
	public class Main extends MovieClip 
	{
		private var camera:Camera3D;
		private var view:View3D;
		private var plane:Plane;
		private var modifier:ModifierStack;
		private var isClick:Boolean;

		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}

		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//
			var _shape:Shape = new Shape();
			_shape.graphics.beginFill(0x8EC3C9);
			_shape.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			_shape.graphics.endFill();
			addChild(_shape);

			create3D();
			createObject();

		}

		private function create3D():void 
		{
			camera = new Camera3D();
			camera.z = -1000;

			view = new View3D( { x:stage.stageWidth/2, y:stage.stageHeight/2 } );
			view.camera = camera
			addChild(view);

			addEventListener(Event.EXIT_FRAME, onEnterRender);
		}

		private function onEnterRender(e:Event):void 
		{
			if (isClick) {
				modifier.apply();
			}else {
				var mX:Number = stage.mouseX > 0 ? stage.mouseX : 0;
				var mY: Number = stage.mouseY > 0 ? stage.mouseY : 0;

				var tarX:Number = 1.5*(mX - stage.stageWidth/2);
				var tarY:Number = 6*(mY - stage.stageHeight/2);

				var dX:Number = camera.x - tarX;
				var dY:Number = camera.y - tarY;

				camera.x -= dX*.1;
				camera.y = dY * .1;

				camera.lookAt(plane.position);
			}

			view.render();
		}

		private function createObject():void {
			plane = new Plane();
			plane.width = 400;
			plane.height = 300;
			plane.rotationX = 90;
			plane.ownCanvas = true;
			plane.useHandCursor = true;
			plane.material = new ColorMaterial(0x666666);
			plane.filters = [new DropShadowFilter(4, 90, 0, .5, 4, 4, .5)];

			view.scene.addChild(plane);

			plane.addOnMouseDown(planeMouseDown);
		}

		private function planeMouseDown(e:MouseEvent3D):void 
		{
			plane.removeOnMouseDown(planeMouseDown);
			//
			isClick = true;
			var tearplanes:ObjectContainer3D = new ObjectContainer3D();
			tearplanes.name = "tearplanes";
			view.scene.addChild(tearplanes);

			var bmpData:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight,false);
			bmpData.draw(this);

			var _plane:Plane = new Plane({segmentsW:10, segmentsH:10,width:stage.stageWidth,height:stage.stageHeight,rotationX:90});
			_plane.material = new BitmapMaterial(bmpData, { smooth:true } );
			_plane.ownCanvas = _plane.bothsides = true;
			tearplanes.addChild(_plane);

			var bend:Bend = new Bend();
			bend.offset = 1;
			bend.angle = 182;

			TweenLite.to(bend, 1.5, { force:1,ease:Quad.easeInOut} );
			TweenLite.to(_plane, 2, { y: -600, ease:Quad.easeInOut, delay:.05 } );

		    modifier = new ModifierStack(new LibraryAway3d(), _plane);
			modifier.addModifier(bend);

			camera = new Camera3D( { x:0, y:0, z: -900 } );

			view.camera = camera;

			plane.alpha = 0;

			var __shape:Shape = getChildAt(0) as Shape;
			__shape.graphics.beginFill(0xFFFFFF * Math.random(), 1);
			__shape.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
			__shape.graphics.endFill();

			TweenLite.delayedCall(1.8,clearEffect);
		}

		private function clearEffect():void 
		{
			var _planes:ObjectContainer3D = view.scene.getChildByName("tearplanes") as ObjectContainer3D;
			while(_planes.children.length) _planes.removeChild(_planes.children[0]);
			view.scene.removeChild(_planes);
			modifier.clear();
			modifier = null;

			TweenLite.to(plane, .4, { alpha:1 } );

			plane.addOnMouseDown(planeMouseDown);
			isClick = false;
		}

	}

}

Demo

胆大心细脸皮厚