2009/03/26 | [转]PV3D
类别(flash As) | 评论(1) | 阅读(1575) | 发表于 16:15

PV3D 倒影照片墙

by shine on Mar.06, 2009, under Flash, 我的作品

点击图片查看演示效果

为客户做的一个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();
}
}
}

:, , , ,

4 comments for this entry:

shine

这个只是一个矩阵的阵列算法.
var c_x:Number=Math.round(planeW*index-Math.floor(index/xnum)*(planeW*xnum));
这个代表 物体的宽度*物体的序号-((序号/X轴列数)*(一排宽度))=该序号的物体在当前阵列中应有的X坐标

再次简化等式为

物体的宽体*该物体的序号-前面整数排的长度=该物体在当前排的X位置.

0

评论Comments

日志分类
首页[193]
flash As[107]
有的没的[59]
数码照片[4]
自由世界[19]
blender[4]