package { import flash.display.Sprite; import flash.events.Event; import flash.filters.BlurFilter; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.view.BasicView; import org.papervision3d.core.material.TriangleMaterial; import org.papervision3d.materials.BitmapColorMaterial; import org.papervision3d.view.layer.ViewportLayer; [SWF(width = "600", height = "600", backgroundColor = "#ffffff", frameRate = "60")] /* * * PV3D Depth Of Field * by Duarte Peixinho * duarte.peixinho@gmail.com * page: http://duartepeixinho.com * */ public class Main extends BasicView { private var cubes:Array = new Array(); private var vpl:Array = new Array(); private const DISTANCE:int = 1500; public function Main():void { init3d(); addEventListener(Event.ENTER_FRAME, processFrame); startRendering(); } public function init3d():void { //initiation 3d Scene //cubes for (var i:int = 0; i < 50; i++) { cubes[i] = new Cube(materialCube(), 200, 200, 200, 1, 1, 1); cubes[i].x = Math.random() * 1600 - 800; cubes[i].y = Math.random() * 1600 - 800; cubes[i].z = Math.random() * 8000; vpl[i] = viewport.getChildLayer(cubes[i], true); vpl[i].filters = [new BlurFilter(10, 10)]; scene.addChild(cubes[i],i.toString()); } } private function materialCube():MaterialsList { var materialist : MaterialsList = new MaterialsList(); var front : TriangleMaterial = new BitmapColorMaterial(Math.random()* 0xffffff); var back : TriangleMaterial = new BitmapColorMaterial(Math.random()* 0xffffff); var left : TriangleMaterial = new BitmapColorMaterial(Math.random()* 0xffffff); var right : TriangleMaterial = new BitmapColorMaterial(Math.random()* 0xffffff); var top : TriangleMaterial = new BitmapColorMaterial(Math.random()* 0xffffff); var bottom : TriangleMaterial = new BitmapColorMaterial(Math.random()* 0xffffff); materialist.addMaterial(front , "front"); materialist.addMaterial(back , "back"); materialist.addMaterial(left , "left"); materialist.addMaterial(right , "right"); materialist.addMaterial(top , "top"); materialist.addMaterial(bottom , "bottom"); return materialist; } private function processFrame(e:Event):void { for (var i:int = 0; i < cubes.length; i++) { if (_camera.distanceTo(cubes[i]) > DISTANCE * 5 || cubes[i].z<-600) scene.removeChild(cubes[i]); else if (!scene.getChildByName(i.toString())) scene.addChild(cubes[i], i.toString()); cubes[i].z += (stage.stageHeight / 2 - mouseY) / 20; //depth of field if (Math.sqrt(Math.pow(_camera.distanceTo(cubes[i]) - DISTANCE, 2)) <= DISTANCE) { if (Math.sqrt(Math.pow(_camera.distanceTo(cubes[i]) - DISTANCE, 2)) / 50 < 10) vpl[i].filters = [new BlurFilter(Math.sqrt(Math.pow(_camera.distanceTo(cubes[i]) - DISTANCE, 2)) / 50, Math.sqrt(Math.pow(_camera.distanceTo(cubes[i]) - DISTANCE, 2)) / 50)]; else vpl[i].filters = [new BlurFilter(10, 10)]; } } singleRender(); } } } PV3D Depth of Field