Vox (PV3D Pixel3D – Processing)
Hace ya un tiempo se han publicado los Archivos Open Source del proyecto del video clip RADIOHEAD House o_f Cards que fue realizado con herramientas Open Source como Lenguaje
Processing es un lenguaje y entorno de programación de código abierto basado en Java, de fácil utilización, y que sirve como medio para la enseñanza y producción de proyectos multimedia e interactivos de diseño digital. Fue iniciado por Ben Fry y Casey Reas a partir de reflexiones en el Aesthetics and Computation Group del MIT Media Lab.
Processing es desarrollado por artistas y diseñadores como una herramienta alternativa al software propietario. Puede ser utilizado tanto para aplicaciones locales así como aplicaciones para la web (Applets).
Al estar basado en Java, puede heredar todas sus funcionalidades, convirtiéndose en una herramienta poderosa a la hora de encarar proyectos complejos.
El vídeo clip fue grabado con unas cameras y sensores especiales que emiten y vuelven a captar ultrasonido, registrando todo su alrededor. Si nos descargamos los archivos zip de la página nos encontramos con unos dos-mil archivos de texto (.csv). Bien cada archivos corresponde a un fotograma que se reproduce a unos (30 fps). Dentro de cada archivo encontramos unos números separados por comas, cada número corresponde a coordenadas X,Y,Z y Intensidad de cada Pixel que final mente forma una imagen en entorno 3D.
Una vez interpretado todos los coordenadas aparece una imágen como acontinuación...
El proyecto se ha elaborado con Tecnologia Flash Action Script 3 (AS3) y con PaperVision3D que me servio como entorno 3D para interpretar coordenadas 3D.
/* * Dm211_Vox.as Read external file with X,Y,Z and Intensity coordinates. * Sample file is OpenSource Sample From HouseOfCards Project * Based on (Pixel Processing) and (Heavy Damaged Head "Voxel"). * * Author: Anthony Belyaev * Mail: belyaev@dm211.com * Web site: http://blog.dm211.com * First version writed on 10 Ago. 2009 16:19 */ package { import flash.display.Sprite; import flash.events.*; import flash.net.*; import flash.text.TextField; import flash.text.TextFormat; import net.hires.debug.*; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; import org.papervision3d.core.geom.*; import org.papervision3d.core.geom.renderables.*; import org.papervision3d.view.layer.*; import org.papervision3d.cameras.*; import org.papervision3d.core.effects.utils.*; [SWF ( width = '640', height = '480', backgroundColor = '#bfbfbf', frameRate = '120' ) ] public class dm211_vox extends Sprite { //_____________________________pv3d private var viewport:Viewport3D; private var scene:Scene3D; private var camera:Camera3D; private var renderer:BasicRenderEngine; //_____________________________ private var isOribiting:Boolean; private var cameraPitch:Number=90; private var cameraYaw:Number=270; private var previousMouseX:Number; private var previousMouseY:Number; //_____________________________ private var textfield:TextField; public function dm211_vox(){ //__________________________textfield textfield = new TextField(); textfield.defaultTextFormat = new TextFormat("_sans"); textfield.text = "> Console: Init SWF"; textfield.autoSize = "left"; textfield.x = (stage.stageWidth >> 1) - (textfield.width >> 1); addChild(textfield); //__________________________FPS INFO addChild(new Stats()); //_____________________________basic PV3D Scene setup viewport = new Viewport3D(stage.stageWidth, stage.stageHeight, true, false, false, false); addChild(viewport); scene = new Scene3D(); camera = new Camera3D(); renderer = new BasicRenderEngine(); loadFileData(); addEventListener(Event.ENTER_FRAME, render); addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); addEventListener(MouseEvent.MOUSE_UP, onMouseUp); addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheel); } private function loadFileData():void{ //_____________________________LoadFile var lodr:URLLoader=new URLLoader(); lodr.load(new URLRequest("http://blog.dm211.com/wp-content/uploads/2009/08/data.csv")); lodr.addEventListener(Event.COMPLETE, processData); lodr.addEventListener(ProgressEvent.PROGRESS, onProgress); } private function onProgress(event:ProgressEvent):void{ textfield.text = "> Console: Loading extern data file ("+event.target.bytesLoaded+"kb of "+event.target.bytesTotal+"kb) ["+(event.target.bytesLoaded/event.target.bytesTotal*100)+"%]"; } private function processData(event:Event):void{ var dataFromFile:String=event.target.data; var dataFile:Array=dataFromFile.split("\r"); var bfx:BitmapEffectLayer=new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight, true, 0xff, BitmapClearMode.CLEAR_PRE, true); bfx.clearBeforeRender=true; viewport.containerSprite.addLayer(bfx); var pixels:Pixels = new Pixels(bfx); for (var i:int=0;i 0 ? cameraPitch : 0.0001; cameraPitch = cameraPitch < 180 ? cameraPitch : 179.9999; previousMouseX = event.stageX; previousMouseY = event.stageY; camera.orbit(cameraPitch, cameraYaw); } } public function onMouseWheel(event:MouseEvent):void { camera.zoom += event.delta; } private function render(event:Event):void{ //_____________________________render renderer.renderScene(scene, camera, viewport); } } }
![[Dm211] [Dm211]](http://blog.dm211.com/wp-content/themes/mystique-extend/uploads/dm211_2k11_logoShaded_102.png)