3D Face Pixels w/DoF
/**
* Copyright bradsedito ( http://wonderfl.net/user/bradsedito )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/vF37
*/
// forked from whirlpower's 粘土に顔埋めた感じの
package
{
/*
画像読んで、RチャンネルをピクセルのZに使う。
*/
import flash.display.*;
import flash.events.*;
import flash.system.*;
import flash.net.*;
import flash.filters.GlowFilter;
import flash.filters.BlurFilter;
[SWF(width=465, height=465, frameRate=60, backgroundColor=0x000000)]
public class Main extends Sprite
{
private var url:String = "http://a8.sphotos.ak.fbcdn.net/hphotos-ak-snc6/222928_10100105357484641_9021630_48830077_2656553_n.jpg?dl=1";
//:String = "http://a8.sphotos.ak.fbcdn.net/hphotos-ak-snc6/183254_890920915271_9021630_48262090_7490801_n.jpg?dl=1";
private var loader :Loader;
private var particles :Array = [];
private var bitmapData :BitmapData;
private var renderer :Renderer;
private var gloww:GlowFilter = new GlowFilter(0xffffff, 1, 6,6, 4, 2, false);
private var blurr:BlurFilter = new BlurFilter( 2,2,2 );
public function Main():void
{
loader = new Loader();
loader.contentLoaderInfo.addEventListener( Event.COMPLETE, complateHandler );
loader.load( new URLRequest(url), new LoaderContext(true) );
}
private function complateHandler(e:Event):void
{
loader.contentLoaderInfo.removeEventListener( Event.COMPLETE, complateHandler );
bitmapData = e.target.content.bitmapData;
addChild( new Bitmap( bitmapData ) );
var color :int = 0;
var xx :int = 0;
var yy :int = 0;
var w :int = bitmapData.width;
var h :int = bitmapData.height;
var s :int = 6;
for( yy = 0; yy < h; yy++ ){
for ( xx = 0; xx < w; xx++ ){
color = bitmapData.getPixel( xx, yy );
var red :int = (color >> 16) & 0xff;
var green :int = (color >> 8) & 0xff;
var blue :int = (color >> 0) & 0xff;
var px :Number = ( xx * s ) - ( w / 2 * s );
var py :Number = ( yy * s ) - ( h / 2 * s );
if ( red > 1 )
particles.push( new Particle( px, py, int(red/2)) );
}
}
// レンダリングスクリーン
renderer = new Renderer( stage.stageWidth, stage.stageHeight, particles );
addChild( renderer );
stage.addEventListener( MouseEvent.MOUSE_DOWN, onMouse );
stage.addEventListener( MouseEvent.MOUSE_UP, onMouse );
addEventListener(Event.ENTER_FRAME, onEnterFrame );
}
private function onMouse( e:MouseEvent ):void
{
if( e.type == "mouseDown" )mouseDown = true;
if( e.type == "mouseUp" )mouseDown = false;
}
private var vx :Number = 1;
private var vy :Number = 0;
private var lx :Number = 0;
private var ly :Number = 0;
private var friction :Number = 0.999;
private var mouseDown :Boolean = false;
private function onEnterFrame( e:Event ):void
{
// 横回転
if ( mouseDown )
vx = lx - stage.mouseX;
else
vx *= friction;
if( Math.abs( vx ) <= 0.1 )
vx = 0;
lx = stage.mouseX;
// 縦回転
if( mouseDown )
vy = ly - stage.mouseY;
else
vy *= friction;
if( Math.abs( vy ) <= 0.1 )
vy = 0;
ly = stage.mouseY;
// 座標回転
for each( var particle:Particle in particles )
{
rocalRotate( particle, "z", "y", vy );
rocalRotate( particle, "x", "z", -vx );
}
renderer.draw();
}
/////////////
//// DoF!!!
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private function rocalRotate( particle:Particle, a:String, b:String, v:Number ):void
{
var cos :Number, sin :Number, posA:Number, posB:Number,
rad :Number = Math.PI / 360;
cos = Math.cos( v * rad );
sin = Math.sin( v * rad );
posA = particle[a];
posB = particle[b];
particle[a] = posA * cos - posB * sin;
particle[b] = posB * cos + posA * sin;
this.filters = [gloww];
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
internal class Particle
{
public var x :Number = 0;
public var y :Number = 0;
public var z :Number = 0;
public function Particle( x:Number=0, y:Number=0, z:Number=0 ):void
{
this.x = x; this.y = y; this.z = z;
}
}
import flash.display.*;
internal class Renderer extends Bitmap
{
private var particles :Array;
private var vpX :int = 0;
private var vpY :int = 0;
private var fl :uint = 500;
public function Renderer( _w:int, _h:int, particles:Array ):void
{
this.particles = particles;
bitmapData = new BitmapData( _w, _h, true, 0x00 );
vpX = int( _w/2 ); vpY = int( _h/2 );
fl = 500;
}
public function draw():void
{
var scale:Number, viewX:int, viewY:int, color:uint, c1:int;
bitmapData.lock();
bitmapData.fillRect( bitmapData.rect, 0x00 );
for each( var p:Particle in particles )
{
scale = fl / ( fl + p.z );
viewX = vpX + p.x * scale;
viewY = vpY + p.y * scale;
c1 = 255 - ( ( p.z + 50) / 100 * 255 );
c1 = c1 < 0? 0:c1;
c1 = c1 > 255? 255:c1;
color = 0xff000000 | c1 << 16 | c1 << 8 | c1;
bitmapData.setPixel32( viewX, viewY, color );
}
bitmapData.unlock();
}
}