点击图片查看演示效果
为客户做的一个3D照片墙的效果,许久之前用PV3D做过几个case之后就再没用过了,今天算拿这个case练练手,还好,花了大概4个小时的时间完成效果和数据架构的搭建。
1.支持XML动态添加图片。(点击查看XML格式)
2.支持入场动画效果。
3.鼠标MouseOver、MouseOut效果。
4.支持动态倒影效果。
源码如下,copy粘贴成Document Class即可。
package
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.StageQuality;
import flash.filters.*;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import org.papervision3d.core.render.sort.BasicRenderSorter;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.render.BasicRenderEngine;
import pounds.pic_container;
//pv3d 加载PV3D引擎
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.core.utils.virtualmouse.*;
import org.papervision3d.core.utils.*;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.core.render.filter.BasicRenderFilter;
import org.papervision3d.core.effects.view.ReflectionView;
import flash.utils.setInterval;
import flash.utils.clearInterval;
import gs.TweenMax;
import gs.easing.*;
import com.flashdev.bitmap.*;
/**
* …
* @author ezshine
*/
public class main extends Sprite
{
private var r_view:ReflectionView;
private var vMouse:VirtualMouse;
private var mouse3D:Mouse3D;
private var xmlConfigloader:URLLoader;
private var pic_cfg:XML;
private var planeContainer:DisplayObject3D;
private var xnum:int = 10;
private var ynum:int = 6;
private var xindex:int=0;
private var yindex:int = 0;
private var piclength:int;
private var xdistance:int = 2;
private var ydistance:int = 4;
private var xyArray:Array;
public function main()
{
setupStage();
loadPhotoXML();
}
public function setupStage()
{
stage.frameRate = 60;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.HIGH;
}
public function setupPapervision()
{
xyArray = new Array();
r_view = new ReflectionView(stage.stageWidth, stage.stageHeight, true, true);
vMouse = r_view.viewport.interactiveSceneManager.virtualMouse;
mouse3D = r_view.viewport.interactiveSceneManager.mouse3D;
Mouse3D.enabled = true;
addChild(r_view);
r_view.camera.zoom = 120;
planeContainer = new DisplayObject3D(”planeContainer”);
piclength = pic_cfg.children().length();
for (var i:int = 0; i < piclength; i++)
{
xyArray.push(i);
}
r_view.surfaceHeight = -((58 + 4) * 6 - 4);
r_view.viewportReflection.alpha = .1;
r_view.viewportReflection.filters = [new BlurFilter(5, 5, 1)]
r_view.viewport.filters = [new DropShadowFilter(3, 45, 0,.2,5,5,1,1)];
r_view.scene.addChild(planeContainer);
startAddTimer();
addEventListener( Event.ENTER_FRAME, loop );
}
private function addBackSquare()
{
var randomindex:int = Math.floor(Math.random() * xyArray.length);
var index:int = xyArray[randomindex];
var src:String = pic_cfg.children()[index].attribute(”src”);
var planeMovie:pic_container = new pic_container(src);
var planMaterial:MovieMaterial = new MovieMaterial(planeMovie, false, true);
var picPlane:Plane = new Plane(planMaterial, planeMovie.width, planeMovie.height, 1, 1);
var c_x:Number=Math.random()*(stage.stageWidth)-stage.stageWidth/2;
var c_y:Number =Math.random()*(stage.stageHeight)-stage.stageHeight/2;
picPlane.x = c_x;
picPlane.y = c_y;
picPlane.z = 50 + Math.floor(Math.random() * 50);
picPlane.alpha = .1;
planeContainer.addChild(picPlane, “picPlane_back_” + index);
picPlane.scale = 0;
TweenMax.to(picPlane,1,{scale:1,ease:Elastic.easeOut});
}
private function addSquare()
{
var randomindex:int = Math.floor(Math.random() * xyArray.length);
var index:int = xyArray[randomindex];
xyArray.splice(randomindex, 1);
var src:String = pic_cfg.children()[index].attribute(”src”);
var planeMovie:pic_container = new pic_container(src);
var planMaterial:MovieMaterial = new MovieMaterial(planeMovie, true, true);
planMaterial.smooth = true;
planMaterial.interactive = true;
var picPlane:Plane = new Plane(planMaterial, planeMovie.width, planeMovie.height, 1, 1);
var planeW:int = (54 + xdistance);
var planeH:int = (58 + ydistance);
var c_x:Number=Math.round(planeW*index-Math.floor(index/xnum)*(planeW*xnum));
var c_y:Number = Math.round(planeH * -Math.floor(index/xnum)-planeH/2);
var offsetx:Number = -((54+2)*10-2) / 2+54/2;
var offsety:Number = ((58+4)*6-4) / 2;
picPlane.x = c_x+offsetx;
picPlane.y = c_y + offsety;
picPlane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, Over_Handler);
picPlane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, Out_Handler);
picPlane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, Press_Handler);
planeContainer.addChild(picPlane, “picPlane_” + index);
picPlane.scale = 0;
TweenMax.to(picPlane,1,{scale:1,ease:Elastic.easeOut});
if(xyArray.length<1){
clearInterval(addTimer);
}
}
private function Over_Handler(e:InteractiveScene3DEvent)
{
TweenMax.to(e.target,1,{z:-50,scale:1.5,ease:Elastic.easeOut});
}
private function Out_Handler(e:InteractiveScene3DEvent)
{
TweenMax.to(e.target,1,{z:0,scale:1,ease:Elastic.easeOut});
}
private function Press_Handler(e:InteractiveScene3DEvent)
{
}
private var addTimer:int;
private function startAddTimer()
{
addSquare();
addTimer = setInterval(addSquare, 20);
}
private function loadPhotoXML()
{
xmlConfigloader = new URLLoader();
xmlConfigloader.addEventListener(Event.COMPLETE, parseXML);
var request:URLRequest = new URLRequest(”pic_cfg.xml”);
xmlConfigloader.load(request);
}
private function parseXML(event:Event):void
{
xmlConfigloader.removeEventListener(Event.COMPLETE, parseXML);
pic_cfg = new XML(xmlConfigloader.data);
setupPapervision();
}
public function loop(e:Event)
{
planeContainer.rotationY = (mouseX-stage.width/2)/20;
planeContainer.rotationX = (mouseY-stage.height/2)/20;
r_view.singleRender();
}
}
}