// forked from clockmaker's [PV3D] Field of Blur /** * Papervision3D の勉強用に fork してみたよ。 */ /** * Papervision3Dで被写界深度 * 参照: http://clockmaker.jp/blog/2008/07/pv3d_gw_blur/ */ package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event; import flash.filters.BlurFilter; import org.papervision3d.cameras.Camera3D; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; import com.flashdynamix.utils.SWFProfiler; [SWF(width=465, height=465, frameRate=30, backgroundColor=0xffffff)] /** * document class. */ public class Main extends Sprite { public static const NUM_PANELS:uint = 15; public static const CIRCLE_DISTANCE:int = 500; private var camera:Camera3D; private var renderer:BasicRenderEngine; private var scene:Scene3D; private var viewport:Viewport3D; /** * constructor. */ public function Main() { // bind event listener. addEventListener(Event.ADDED_TO_STAGE, initialize); } /** * initialize the object. */ private function initialize(evt:Event):void { // unbind event listener. removeEventListener(Event.ADDED_TO_STAGE, initialize); // setup stage. stage.align = StageAlign.TOP_LEFT; stage.quality = StageQuality.HIGH; stage.scaleMode = StageScaleMode.NO_SCALE; // setup debugger. SWFProfiler.init(this); // setup PV3D. setupPV3D(); var i:uint, cAngle:Number, nAngle:Number, color:uint, material:ColorMaterial, panel:Plane, wrapper:DisplayObject3D; wrapper = scene.addChild(new DisplayObject3D(), 'wrapper'); camera.lookAt(wrapper); cAngle = 0; nAngle = Math.PI * 2 / NUM_PANELS; for (i=0; i<NUM_PANELS; i++) { color = 0xff * Math.random() << 16|0xff * Math.random() << 8|0xff * Math.random(); material = new ColorMaterial(color, 1); material.doubleSided = true; panel = new Plane(material, 100, 100, 2, 2); panel.x = Math.cos(cAngle) * CIRCLE_DISTANCE; panel.z = Math.sin(cAngle) * CIRCLE_DISTANCE; panel.useOwnContainer = true; panel.lookAt(DisplayObject3D.ZERO); wrapper.addChild(panel, ['panel', i].join('')); cAngle += nAngle; } addEventListener(Event.ENTER_FRAME, loop); } private function loop(evt:Event):void { var i:uint, dx:Number, cx:Number, blur:Number, obj:DisplayObject3D, wrapper:DisplayObject3D; cx = stage.stageWidth / 2; dx = (stage.mouseX - cx) / cx; wrapper = scene.getChildByName('wrapper'); wrapper.yaw(dx * 5); for (i=0; i<NUM_PANELS; i++) { obj = wrapper.getChildByName(['panel', i].join('')); if (!obj) continue; blur = Math.ceil((NUM_PANELS - obj.sceneZ) / 50); obj.filters = [new BlurFilter(blur, blur, 2)]; } renderer.renderScene(scene, camera, viewport); } private function setupPV3D():void { // setup camera. camera = new Camera3D(); camera.y = 200; camera.z = 1000; // setup render engine. renderer = new BasicRenderEngine(); // setup scene. scene = new Scene3D(); // setup viewport. viewport = new Viewport3D(stage.stageWidth, stage.stageHeight, true); addChild(viewport); } } } forked from: [PV3D] Field of Blur