Archive for 2008 年 7月

[Flash]流体っぽいのを作ろうと思った(2)

[Flash]流体っぽいのを作ろうと思ったの解説。

下のサンプルでどんな DisplacementMapFilter で流体っぽい動きになってるか試しみて、ソースを見た方がわかると思います。

 

  • _canvasBmpData : BitmapData
    描画用の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)];
    

  • _mapBmpData : BitmapData
    描画用の _canvasBmpData に適用する DisplacementMapFilter (_displaceMapFilter) の mapBitmap。
    BlurFilterのかかった流体用マップ _fluidBmp が draw() される。(ので、結局 _fluidBmpと同じ見た目 )
  • _displaceMapFilter = new DisplacementMapFilter();
    _displaceMapFilter.mapBitmap = _mapBmpData;
    

  • fluidMapBmpData : BitmapData
    流体用マップ( _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

     

    Related posts

    [Flash]流体っぽいのを作ろうと思った

    流体っぽいのをProcessing.orgのLearingにあるGlen Murphy氏のFluidコードを参考に作ろうと思った。

     

    Fluid \ Learning \ Processing 1.0 (BETA)
    http://processing.org/learning/topics/fluid.html

    Glen Murphy氏のコードはbodytag.orgの「FLUID3」とか、Glen Murphy氏のページにもあるやつ。

    Glen Murphy氏のページのほうでは「Fluid3」のリンク先が「Smoke2」と入れ替わっちゃたりしていますけど。

     

    このProcessingのコードをほぼそのままASでやっているサンプルはPapervison3Dに関わってるRalph Hauwert氏のところでダウンロードできて試せます。

    若干コンパイルエラーがでますけど(voidがVoidだったりとか)、それを解消していけばすぐ動きました。

    Fluid Dynamics : AS3 Source Code.
    http://www.unitzeroone.com/blog/2005/10/25/fluid-dynamics-as3-source-code/

     

    最初は、正統に流体シミュレーションを調べてからなんてちょっと思ったけど、ナビエ-ストークス方程式を理解して・・・なんて、数学のミレニアム懸賞問題とか理解できるわけありません。

    高卒と同時に数学なんて忘れちゃって、四則演算以外の数学記号を見るだけでも嫌なのに。

    Fluid Simulation for Computer Animation
    http://www.cs.ubc.ca/~rbridson/fluidsimulation/

     


    ということで、Glen Murphy氏のProcessingコードをベースにDisplacementMapFilterを使う方法でやってみたのがこれ。

     

    一度クリックしてからドラッグするとFluidっぽい動きします。そして今回も例によって負荷高めなのです。一度始めると止める事はしません。ソースを置いとくので、ダウンロードしてから試した方が無難です。

    それと、Macの場合はFlashPlayer 10で見た方が良いはずです。FlashPlayer 9で作っていますが、FlashPlayer 10では描画速度が速くなってるし(Windows環境と比べてまともになった感じ)。

     

    内容の解説は[Flash]流体っぽいのを作ろうと思った(2)で。ソースは置いとく。

    ソース1:FluidSample.zip
    ソース2:FluidSample_param.zip

     

    Related posts

    [word]踊るんだ。踊り続けるんだ。

    踊るんだ。踊り続けるんだ。何故踊るかなんて考えちゃいけない。意味なんてことは考えちゃいけない。意味なんてもともとないんだ。

    どれだけ馬鹿馬鹿しく思えても、そんなこと気にしちゃいけない。きちんとステップを踏んで踊り続けるんだよ。そして固まってしまったものを少しずつでもいいからほぐしていくんだよ。まだ手遅れになっていないものもあるはずだ。使えるものは全部使うんだよ。ベストを尽くすんだよ。怖がることは何もない。

    それもとびっきり上手く踊るんだ。みんなが感心するくらいに。

    だから踊るんだよ。音楽の続く限り

    村上春樹 ダンス・ダンス・ダンス(上)

    Related posts