以下是PV3D_Effect6 PaperWorld的源码:
package { import flash.display.*; import flash.events.*; import flash.utils.*; import flash.geom.Matrix; import flash.geom.Rectangle; import flash.geom.Point; import flash.system.System; import ImageLoader; import ImageZoom; import org.papervision3d.scenes.Scene3D; import org.papervision3d.cameras.Camera3D; import org.papervision3d.view.Viewport3D; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.materials.BitmapMaterial; import com.greensock.*; import com.greensock.easing.*; [SWF(width="700",height="480",frameRate="25")] /** * ... * @author .....Li灬Star * @contact...QQ:168527720 */ public class PV3D_Effect6 extends MovieClip { private var pic_str:Array=new Array(); private var Speed:Number=3; private var imageloader:ImageLoader; private var loadimage:Bitmap; private var myZoom:ImageZoom; //------------------>建立3D的四大要素 private var scene:Scene3D; private var camera:Camera3D; private var viewport:Viewport3D; private var renderer:BasicRenderEngine; //--------------------------------------> private var wrap:DisplayObject3D; private var planeVO:Plane; private var bmpdataArr:Array; private var bmpdataArrCopy:Array; private var planesArr:Array; private var planeVOs:Array; private var planeNames:Array; private var objs:Array; static private const MAX_CELL_W:uint=10; static private const MAX_CELL_H:uint=5; static private const DISTANCE:Number=500; private var theta:Number=0; private var maxWidth:Number=700; private var maxHeight:Number=450; private var rot:Number=0; private var _rotateAngle:Number=0; public function PV3D_Effect6():void { initmc(); } public function initmc() { setPV3D(); if (imageloader==null) { pic_str=[{src:"img/1.jpg"}]; imageloader=new ImageLoader(pic_str); imageloader.addEventListener("ALLCOMPLETE",AllComplete);//全部加载完成事件 } else { setObject3D(); } } private function setPV3D():void { scene = new Scene3D(); camera = new Camera3D(); viewport=new Viewport3D(864,480,true,false); renderer = new BasicRenderEngine(); this.addChild(viewport); } private function AllComplete(e:Event):void { setObject3D(); } private function setObject3D():void { camera.z=-5000; camera.focus=500; camera.zoom=1; camera.target=DisplayObject3D.ZERO; trace("imageloader.loaderArr.length:"+imageloader.loaderArr.length); for (var u:uint=0; u<imageloader.loaderArr.length; u++) { loadimage=imageloader.loaderArr[u] as Bitmap; } myZoom=new ImageZoom(loadimage.width,loadimage.height,maxWidth,maxHeight); wrap = scene.addChild(new DisplayObject3D()); bmpdataArr=[]; bmpdataArrCopy=[]; //用copyPixels方法分割图片 var splittedWidth:Number=loadimage.width/MAX_CELL_W; var splittedHeight:Number=loadimage.height/MAX_CELL_H; var point:Point = new Point(0,0); for (var i:int=0; i<MAX_CELL_W;i++) { for (var j:int=0; j<MAX_CELL_H; j++) { var bmpData:BitmapData=new BitmapData(splittedWidth,splittedHeight,false,0xFF000000); bmpData.copyPixels(loadimage.bitmapData,new Rectangle(splittedWidth * i,splittedHeight * j,splittedWidth,splittedHeight),point); var bitmap:Bitmap=new Bitmap(bmpData); bitmap.width=myZoom.width()/MAX_CELL_W; bitmap.height=myZoom.height()/MAX_CELL_H; bmpdataArr.push(bitmap.bitmapData); bmpdataArrCopy.push(bitmap.bitmapData); } } //记录分割后的每张图片的原始坐标,后面根据这个坐标数组来合拢图片 planesArr=[]; planeVOs=[]; objs=[]; for (var s:int = 0; s < MAX_CELL_W; s++) { //planeArr[i] = []; for (var t:int = MAX_CELL_H; t > 0; t--) { var material:BitmapMaterial=new BitmapMaterial(BitmapData(bmpdataArr.shift())); material.doubleSided=true; var plane:Plane=new Plane(material,myZoom.width()/MAX_CELL_W,myZoom.height()/MAX_CELL_H,1,1); plane.x=myZoom.width()/MAX_CELL_W * s; plane.y=myZoom.height()/MAX_CELL_H * t; plane.z=0; plane.rotationX=0; plane.rotationY=0; plane.rotationZ=0; //------------object数组记录原始坐标 var obj:Object = new Object(); obj.x=plane.x; obj.y=plane.y; obj.z=plane.z; obj.rotationX=plane.rotationX; obj.rotationY=plane.rotationY; obj.rotationZ=plane.rotationZ; objs.push(obj); planeVO=plane; planeVO.x=0; planeVO.y=0; planeVO.z=0; planeVO.alpha=0; planeVO.useOwnContainer=true; //useOwnContainer这个属性设为true,才能对plane做alpha的调整 planeVOs.push(planeVO); wrap.addChild(planeVO); } } //------------------------->给分割后的每张图片加上name,相当于mc.name planeNames=[]; for (var h:int=0; h<planeVOs.length; h++) { planeVOs[h].name="plane"+h; planeVOs[h].extra={id:h}; //trace(planeVOs[i].name); planeNames.push(planeVOs[h].name); } //---------------------------->随机打乱图片位置,形成3D立体效果 for (var k:int=0; k<planeVOs.length; k++) { TweenMax.to(planeVOs[k],Speed/2,{ x:Math.random() * maxWidth - maxWidth/2, y:Math.random() * maxHeight - maxHeight/2, z:Math.random() * 2000 - 1000, rotationX:Math.random() * 360, rotationY:Math.random() * 360, rotationZ:Math.random() * 360, alpha:1, scale:1, delay:0.04 * k, ease:Cubic.easeOut }); } TweenMax.delayedCall(2.5*Speed,startZoom); addEventListener(Event.ENTER_FRAME,onEventRender3D); addEventListener(Event.ENTER_FRAME,loop); } //--------------------------->合拢图片 private function startZoom():void { removeEventListener(Event.ENTER_FRAME,loop); for (var i:int=0; i<planeVOs.length; i++) { TweenMax.to(planeVOs[i],Speed*1.5,{ x:objs[i].x, y:objs[i].y, z:objs[i].z, rotationX:objs[i].rotationX, rotationY:objs[i].rotationY, rotationZ:objs[i].rotationZ, alpha:1, scale:1, delay:0.05*i, ease:Cubic.easeOut}); } TweenMax.to(camera,Speed*1.5,{ x:0, y:0, z:-1000, focus:100, zoom:10, ease:Quad.easeOut, onUpdate:onUpdateHundler}); TweenMax.to(wrap,Speed*1.5,{ x:-myZoom.width()/2+40, y:-myZoom.height()/2-45, z:0,ease:Quad.easeOut, onComplete:disappearEffect}) } private function onUpdateHundler():void { camera.lookAt(DisplayObject3D.ZERO); renderer.renderScene(scene, camera, viewport); } private function disappearEffect():void { for (var i:int=0; i<planeVOs.length; i++) { TweenMax.to(planeVOs[i],Speed*1.5,{ x:myZoom.width()/2-40, y:myZoom.height()/2+45, z:0, rotationX:Math.random() * 360, rotationY:Math.random() * 360, rotationZ:Math.random() * 360, delay:Speed, alpha:0, ease:Back.easeOut }); } TweenMax.delayedCall(1.7*Speed,End); } //--------------------------->三角函数控制camera private function loop(e:Event):void { camera.x=DISTANCE*Math.sin(theta*Math.PI/180); camera.y=DISTANCE*Math.cos(theta*Math.PI/180); camera.z=DISTANCE*2*Math.cos(theta*Math.PI/180); theta+=1; } //-------------------------->PV3D里面无限渲染,没有渲染就没有3D世界 private function onEventRender3D(e:Event) { renderer.renderScene(scene, camera, viewport); } public function End():void { //-------------------->释放内存 removeEventListener(Event.ENTER_FRAME, onEventRender3D); TweenMax.killAll(); for(var i:uint=0;i<planeNames.length;i++){ wrap.removeChildByName(planeNames[i]); planeVOs[i].material.destroy(); planeVOs[i]=null; } for(var j:int=0;j<bmpdataArrCopy.length;j++){ bmpdataArrCopy[j].dispose(); bmpdataArrCopy[j]=null; } bmpdataArrCopy=[]; planeVOs=[]; theta=0; scene.removeChild(wrap); this.removeChild(viewport); //-----------------------> imageloader.removeEventListener("ALLCOMPLETE",AllComplete); for(var k:int=0;k<imageloader.loaderArr.length;k++){ imageloader.loaderArr[k].bitmapData.dispose(); imageloader.loaderArr[k].bitmapData=null; imageloader.loaderArr[k]=null; } imageloader.loaderArr=[]; imageloader=null; System.gc(); } } }