下のサンプルでどんな DisplacementMapFilter で流体っぽい動きになってるか試しみて、ソースを見た方がわかると思います。
描画用のBitmapData。Bitmap化し、BlurFilterをかけてる。
_canvasBmpData = new BitmapData(MAP_WIDTH, MAP_HEIGHT, false, 0x000000); var canvasBmp : Bitmap = new Bitmap(_canvasBmpData); canvasBmp.filters = [new BlurFilter(4, 4, 1)];
描画用の _canvasBmpData に適用する DisplacementMapFilter (_displaceMapFilter) の mapBitmap。
BlurFilterのかかった流体用マップ _fluidBmp が draw() される。(ので、結局 _fluidBmpと同じ見た目 )
_displaceMapFilter = new DisplacementMapFilter(); _displaceMapFilter.mapBitmap = _mapBmpData;
流体用マップ( _fluidBmp )の元にする FluidMap クラスで計算した結果の BitmapData
_fluidBmp 用の BitmapData となる。
ドラッグすると FluidMap クラスで計算した結果を _fluidBmp として、DisplacementMapFilter の mapBitmap である _mapBmpData に draw() する。
// FluidMap : update fluidMapBmpData = _fluidMap.updateMap(); _fluidBmp.bitmapData = fluidMapBmpData; // update _mapBmpData _mapBmpData.draw(_fluidBmp, _fluidBmp.transform.matrix);
DisplacementMapFilter の内容が変わったので _canvasBmpData に DisplacementMapFilter を繰り返し適用してやることで、描画が変化しつづける。(ことをEnterFrameでやってる。)
//updateDisplaceMapFilter(_canvasBmpData, _displaceMapFilter);で以下の処理 var sourceRect : Rectangle = _canvasBmpData.rect; var destPoint : Point = new Point(sourceRect.left, sourceRect.top); _canvasBmpData.applyFilter(_canvasBmpData, sourceRect, destPoint, _displaceMapFilter);
FluidMap では縦横サイズとグリッドのサイズを指定して、各グリッドのFluid計算用のデータ FluidMapDataを2次元配列に格納する。
例えば、300×300でグリッドのサイズを「10」としたら、30×30=900の各グリッドに対して、Fluidの計算をしてるわけ。仮にグリッド無しでsetPixelしようとすると90000の処理になっっちゃう。
さらにその各グリッドの持つのXY方向のベクトル値を算出するために、隣接する6個のグリッドの値を使うのだけど、その取得にはまたその2次元配列を使うことになるわけで・・・。
その計算をEnterFrameで行っているわけだから、処理も遅くなる。
Fluidの計算自体は Glen Murphy氏のFluidコードのほぼそのまま。超省略な画像を置いておくので、これ見ながらソースを見た方が早いと思います。
必要なのはX方向とY方向の移動量(xVelとyVel)。それをDisplacementMapの色設定に使って、グリッドのサイズでマップ用のBitmapDataを作ってあげる。(色のFadeOutは強制的に色の値を変えちゃってるけど)
CalcPressure.as の「0.20」のところをGlen Murphy氏のFluidコードの通りに「0.25」にしてやると、波紋?な揺れが際立つよ。
ソースは前回と同じ。
ソース1:FluidSample.zip
ソース2:FluidSample_param.zip
