ホーム >> 左脳ActionScript3 >> アクションスクリプト3 >> boidデモを作る >> boidデモ作成 その8:応用編。イロイロの結果。
boidデモ作成 その8:応用編。イロイロの結果。
フラッシュで、「boids」デモを作ってみよう。第8回。応用編。

アレコレやってみたのだが、大本の boids理論 の場合とあまり代わり映えしない前回からの続き。コードも変更点しか示さないので、前回分を良くチェック。

距離を調整したり、バグ出しをしたり、最適化をしたり、バグ出しをしたり、距離を調整したり、更にイロイロ弄くった結果、それなりにバラける物が出来た。


イロイロ弄くった結果

最適化
FlashDevelop 提供の Point クラスの、足し算、引き算は、結果を得る度に Pointオブジェクト を作るようで、相当処理が重くなる。
これを、Point を使わない方法に変更した。それだけでも、結構?軽くなるようだ。
バグ出し
時々 Adobe Flash Player が異常終了する事があった。
これは、距離がゼロ(点同士が完全に重なる状態)になった為に、"近すぎ"の加速度を計算する際ゼロ除算が発生し、この異常の累積(Action Script では、値がNaNとなるだけで処理が止まるわけではない)で異常終了する羽目になっていたようだ。

そのため、近すぎると離れる部分に手を入れ、"超近すぎ"の状態で移動方向をランダムに変更して回避&離脱するような動きを追加してみた。


//  近いものから逃げ、遠いものに近寄る、ほどほどのものと並走する
var b:int   =   i * number_of_points;
var acp_x:Number    =   0;  //  逃げる加速度
var acp_y:Number    =   0;
var atp_x:Number    =   0;  //  近づく加速度
var atp_y:Number    =   0;
var vp_x:Number     =   0;  //  並走方向
var vp_y:Number     =   0;
var ac:int  =   0;  //  後で平均値を取る為のカウンター:逃げる
var at:int  =   0;  //  後で平均値を取る為のカウンター:近づく
var vc:int  =   0;  //  後で平均値を取る為のカウンター:並走
for (var j:int = 0; j < number_of_points; j++)
{
    if (    i != j  )
    {
        var tb:one  =   objs[j];
        var dx:Number;
        var dy:Number;
        var d:Number;
        var dis:Number  =   distance[b + j];
        if (    dis < .5    )
        {   //  超近すぎ
            var r:Number    =   Math.random() * Math.PI * 2.0;
            t.v.x   =   Math.cos(r) * 10;
            t.v.y   =   Math.sin(r) * 10;
        }
        else if (   dis< 1  )
        {   //  近すぎ
            dx  =   t.p.x - tb.p.x;
            dy  =   t.p.y - tb.p.y;
            acp_x   +=  dx / dis;
            acp_y   +=  dy / dis;
            ac++;
        }
        else if (   dis < 11    )
        {   //  近すぎず、遠すぎず、ほどほど
            d   =   tb.v.length;
            vp_x    +=  tb.v.x / d;
            vp_y    +=  tb.v.y / d;
            vc++;
        }
        else if (   dis < 12    )
        {   //  遠い
            dx  =   t.p.x - tb.p.x;
            dy  =   t.p.y - tb.p.y;
            atp_x   +=  dx / dis;
            atp_y   +=  dy / dis;
            at++;
        }
        //  距離が一定以上のものは遠すぎと判断し、なにもしない
    }
}
if (    ac  )
{
    t.v.x   +=  acp_x / ac;
    t.v.y   +=  acp_y / ac;
}
if (    at  )
{
    t.v.x   -=  atp_x / at;
    t.v.y   -=  atp_y / at;
}
if (    vc  )
{
    t.v.x   +=  vp_x    /   vc;
    t.v.y   +=  vp_y    /   vc;
}

Get Adobe Flash player
また、近い、ほどほど、遠い、などの距離のパラメータを調整した結果、魚の群れではなく、鳥の群れのような動きになってきた。

魚と鳥の群れの違いがよく判らない人は、「巨大水槽のある水族館」「多量のムクドリやスズメの糞害に悩む地域」等に出向いて、一度その動きを良く観察する事をオススメする。

特に、鳥の群れの場合「渡り鳥が目的地に向かって一斉に飛び立つ様子」と「多量のハト、スズメ、ムクドリ、なんかが公園等で群れて飛んでいる様子」が全然違うと言う事が理解できなければ、タブン私の言っている事は理解できないだろう。
「都心から小一時間ほど離れた、中途半端に田舎成分の高い街の付近にある畑」が身近にあれば、少なくともスズメ、ムクドリの群れは観察できるだろう。このページを見ている内のどれ程の人が、その様な環境にあるのかは判らないが。


なんにせよ、一度集まって一つになった群れも、徐々に形を崩し群れが分裂するようになり、より「生き物の集団」っぽく見えるようになった。


>> まとめへ。

トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/193

コメントする

ホーム >> 左脳ActionScript3 >> アクションスクリプト3 >> boidデモを作る >> boidデモ作成 その8:応用編。イロイロの結果。