曲げセンサでカメラ映像をゆらゆらさせよ
forked from カメラ映像をゆらゆらさせよ (diff: 38)
Gainerを使って * 曲げセンサでWEBカメラの映像をゆらゆらさせよう。 * という。 * * やってみよ *
ActionScript3 source code
/**
* 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/pF6D
*/
// forked from umi_kappa's カメラ映像をゆらゆらさせよ
/*
* Gainerを使って
* 曲げセンサでWEBカメラの映像をゆらゆらさせよう。
* という。
*
* やってみよ
* */
package {
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.geom.*;
import flash.media.Camera;
import flash.media.Video;
import flash.net.*;
import flash.system.*;
import flash.text.*;
import funnel.Convolution;
import funnel.Gainer;
import funnel.Pin;
import funnel.Scaler;
public class test extends Sprite {
//かけるフィルタよう
private var translate:int = 0;
private var dpm_filter:DisplacementMapFilter;
private var rSeed:Number = 0;
private var mapBmd:BitmapData;
//カメラ用
private var _canvas:BitmapData;
private var _mirror:Matrix;
private var _video:Video;
private var _bm:Bitmap;
//Gainer
private var _gio:Gainer;
private var _mage_Pin:Pin;
private var _mage_value:int;
public function test() {
//Gainerのセッティング
gainer_set();
var _camera:Camera = Camera.getCamera();
//カメラがない
if (_camera == null) {
return;
}
//カメラの設定
_camera.setMode(stage.stageWidth, stage.stageHeight, stage.frameRate);
_video = new Video(400, 400);
_video.attachCamera(_camera);
_video.x = stage.stageWidth / 2;
_video.y = stage.stageHeight / 2;
//映像を流し込むbitmap
_canvas= new BitmapData(stage.stageWidth, stage.stageHeight);
_bm = new Bitmap(_canvas);
addChild(_bm);
//中央配置
_bm.x = stage.stageWidth / 2 - _video.width / 2;
_bm.y = stage.stageHeight / 2 - _video.height / 2;
//映像を反転
_mirror = new Matrix();
_mirror.scale( -1, 1);//scale(sx,sy) X方向にsx倍,Y方向にsy倍
_mirror.translate(_video.width, 0);
addEventListener(Event.ENTER_FRAME, onEF);
//フィルタ適応
filter_set();
}
/*
* Gainerのセッティング
* */
private function gainer_set():void
{
_gio = new Gainer();
//アナログINの0を使うよ
_mage_Pin = _gio.analogInput(0);
//フィルターをかける
_mage_Pin.addFilter(new Scaler(0.5, 0.8, 0, 80, Scaler.LINEAR, true));
_mage_Pin.addFilter(new Convolution(Convolution.MOVING_AVERAGE));
}
private function onEF(e:Event):void
{
//bitmapに流し込む&反転のマトリックスをかける。
_canvas.draw(_video, _mirror);
//なみなみさせる関数
wave();
//曲げセンサーの値を毎フレーム見る。
_mage_value = Math.round(_mage_Pin.value);
}
private function filter_set():void
{
//フィルタをかける用
mapBmd = new BitmapData(_bm.width,_bm.height);
/*
* DisplacementMapFilterの設定
* */
dpm_filter = new DisplacementMapFilter();
//mapBitmap 置き換えマップイメージを示す
dpm_filter.mapBitmap = mapBmd;
//mapPoint 左上を基準とした場合の置き換えマップイメージの左上座標を軸に
dpm_filter.mapPoint = new Point(0, 0);
//componentX/Y 置き換えに使用するカラーチャンネル 8=alpha
dpm_filter.componentX = 8;
dpm_filter.componentY = 8;
//scaleX/Y 効果を拡大縮小する係数
dpm_filter.scaleX = 200;
dpm_filter.scaleY = 200;
//フィルタのモード
dpm_filter.mode = DisplacementMapFilterMode.COLOR;
//範囲外置き換えに使う代替カラー
dpm_filter.color = 0x000000;
//範囲外のアルファ
dpm_filter.alpha = 0;
rSeed = new Date().getTime();
}
private function wave():void
{
//ぱたぱたするスピード
if(_mage_value > 10) translate += _mage_value;
var pt:Point = new Point(translate, 0);
mapBmd.perlinNoise(
_bm.width,
_bm.height,
2,
rSeed,
true,
true,
BitmapDataChannel.RED | BitmapDataChannel.BLUE | BitmapDataChannel.GREEN | BitmapDataChannel.ALPHA,
false,
[pt, pt]
);
_bm.filters = [dpm_filter];
}
}
}
