In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

宇宙との最終交信風WEBカメラ

ちと使ってみたくなったんで、読み解く!
* 
* このぐにゃぐにゃ具合をコントロールできたらいいなー
* 
* pbjファイルを読み込んでいるから細かい編集には手が出せないやー
* PixelBenderToolkitも勉強してみなきゃ。
*
/**
 * Copyright umi_kappa ( http://wonderfl.net/user/umi_kappa )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/86SS
 */

// forked from actionscriptbible's Chapter 38 Example 2
/*ちと使ってみたくなったんで、読み解く!
 * 
 * このぐにゃぐにゃ具合をコントロールできたらいいなー
 * 
 * pbjファイルを読み込んでいるから細かい編集には手が出せないやー
 * PixelBenderToolkitも勉強してみなきゃ。
 * */

package {
  import flash.display.*;
  import flash.events.*;
  import flash.filters.*;
  import flash.geom.*;
  import flash.media.*;
  import flash.net.*;
  import flash.utils.*;
  
  public class Main extends Sprite {
    protected var holder:Sprite;
    protected var video:Video;
    protected var testPattern:Loader;
    protected var noise:BitmapData;
    
    protected var shader:Shader;
    protected var shaderFilter:ShaderFilter;
    
    protected var smoothRandomNoise:BitmapData;
    protected var pointers:Vector.<Point>;
    protected var rands:Vector.<Number>;
    
    public function Main() {
		//LOWの方がリアルかも
      stage.quality = StageQuality.LOW;
	  
      holder = new Sprite();
      noise = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0);
	  
	  //WEBカメラの映像をGET
      var camera:Camera = Camera.getCamera();
	  //カメラの映像をvideoに設定
      video = new Video(stage.stageWidth/2, stage.stageHeight/2);
      video.scaleX = video.scaleY = 2;
	  
	  //根本的なwebカメラのサイズを設定する
      camera.setMode(stage.stageWidth/2, stage.stageWidth/2, stage.frameRate, false);
      /*Videoクラスは,単にcamera.setMode()で設定したサイズに対して縮小・拡大してサイズを調整するだけなので,
	   * webカメラのサイズがVideoクラスで設定したサイズより小さければ,
	   * どんなに高解像度のwebカメラを使っても画質が低く表示されてしまいます. だそうです(笑)*/
	  video.attachCamera(camera);
	  
	  //夜中のテレビみたいな画像を配置
      testPattern = new Loader();
      testPattern.blendMode = BlendMode.ADD;
      testPattern.alpha = 0;
      holder.addChild(video);
      holder.addChild(testPattern);
      addChild(holder);
      
      smoothRandomNoise = new BitmapData(300, 10, false, 0);
      smoothRandomNoise.perlinNoise(Math.random()*100, Math.random()*100, 4,30 * int(1000*Math.random()), true, true, 7);
      /*こいつがキモみたい。 perlinNoise
	   * 1 ぐにゃぐにゃになるスピード?? X
	   * 2 ぐにゃぐにゃになるスピード?? Y
	   * 3 これを増やすとさらにぐじゃぐじゃになる.
	   * 4 乱数を生成するための元となる数値を指定する ノイズの幅?? ここがコントロールと関係ありそう
	   * 5 つなぎめが綺麗に見えるかどうか
	   * */
	  
	  pointers = new Vector.<Point>(12);
      rands = new Vector.<Number>(12);
      for (var i:int = 0; i < 12; i++)
        pointers[i] = (new Point(
          Math.random()*smoothRandomNoise.width,
          Math.random()*smoothRandomNoise.height));
      
		  //pixecbender系??
      var PBJURL:String = "http://actionscriptbible.com/files/badreception.pbj";
      var loader:URLLoader = new URLLoader(new URLRequest(PBJURL));
      loader.dataFormat = URLLoaderDataFormat.BINARY;
      loader.addEventListener(Event.COMPLETE, onBytecodeLoaded);
      
	  //放送テストみたいな画像
      var IMGURL:String = "http://actionscriptbible.com/files/testpattern.jpg";
      testPattern.load(new URLRequest(IMGURL));
      testPattern.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
    }
	
	
    protected function onBytecodeLoaded(event:Event):void {
      shader = new Shader(URLLoader(event.target).data);
      shaderFilter = new ShaderFilter(shader);
      shader.data.noiseImage.input = noise;
      shader.data.srcImage.input = noise; 
      shader.data.dimensions.value = [noise.width, noise.height];

      stage.fullScreenSourceRect = noise.rect;
      stage.addEventListener(MouseEvent.CLICK, onFullScreen);
      stage.addEventListener(Event.ENTER_FRAME, go);
    }
	
    protected function go(event:Event):void {
      noise.noise(getTimer(), 0, 255, 7, true);
	  
      for (var i:int = 0; i < pointers.length; i++) {
        var p:Point = pointers[i];
        p.x = (int(p.x) + 2*(1+i)) % smoothRandomNoise.width;
        rands[i] = smoothRandomNoise.getPixel(p.x, p.y) / 0x00ffffff;
      }
      
      testPattern.alpha = Math.max(0, rands[6] * 3 - 2);
	  
      var sd:ShaderData = shader.data;
	  /*
	   * ここの数値をどうにかしたらコントロールできそう。
	   * */
	  //横にピピっとでるノイズ
      sd.noisyHDisplace.value = [Math.pow(rands[2],4)*40];
      //上下の移動
	  sd.vRoll.value = [rands[0] * 80 - 20];
      //色
	  sd.channelSplit.value = [rands[3] * 40 - 10];
	  //なみ?
      sd.sinHDisplaceAmplitudes.value = [20.0, 2.0, 1.0];
	  //なみ? ガタガタをなめらかに
      sd.sinHDisplaceFrequencies.value = [rands[2]*2+0.4, rands[10]*4+4, rands[11]*8+8];
      //なみ?
	  sd.sinHDisplace.value = [Math.pow(rands[2], 8) * 100];
	  //粒子状のノイズ
      sd.noiseLayer.value = [Math.pow(rands[10], 4) * 0.8];
	  //くろい横棒
      sd.blackoutThresh.value = [rands[2] * 0.3];
	  
      holder.filters = [shaderFilter];
    }
	
	//画像を読み終わったら
    protected function onImageLoaded(event:Event):void {
      testPattern.width = noise.width;
      testPattern.height = noise.height;
    }
	
	//画面をクリックするとフルスクリーンに
    protected function onFullScreen(event:MouseEvent):void {
      if (stage.displayState == StageDisplayState.FULL_SCREEN) {
        stage.displayState = StageDisplayState.NORMAL;
      } else {
        stage.displayState = StageDisplayState.FULL_SCREEN;
      }
    }
  }
}