ホーム >> 左脳ActionScript3 >> アクションスクリプト3 >> boidデモを作る >> boidデモ作成 その4:「boids理論」遠くのものに近寄る。
boidデモ作成 その4:「boids理論」遠くのものに近寄る。
フラッシュで、「boids」デモを作ってみよう。第4回。

何故か微生物の動きを再現できた前回からの続き。コードも変更点しか示さないので、前回分を良くチェック。


さて、ここで boids理論を思い出そう。ここで止めては、微生物のままだ。
  1. 距離が近すぎれば遠のく
  2. 距離が離れていれば近づく
  3. ほどほどの距離なら並走(移動方向を回りにあわせようとする)
このルールの一番上は、とりあえず実現できた。次は「距離が離れていれば近づく」というルールの実現だ。


遠くのものに近寄る

コードは「距離が近すぎるものから逃げる」のものを応用できる。むしろ、殆ど同じになる。
最適化の観点からも、流れが共通に出来る所が多いので「距離が近すぎるものから逃げる」を「近いものから逃げ、遠いものに近寄る」に作り変えよう。


//  近いものから逃げ、遠いものに近寄る
var b:int   =   i * number_of_points;
var acp:Point   =   new Point();    //  逃げる加速度
var atp:Point   =   new Point();    //  近づく加速度
var ac:int  =   0;  //  後で平均値を取る為のカウンター:逃げる
var at:int  =   0;  //  後で平均値を取る為のカウンター:近づく
for (var j:int = 0; j < number_of_points; j++)
{
    if (    i != j  )
    {
        var tb:one;
        var d:Point;
        var dis:Number  =   distance[b + j];
        if (    dis< 10 )
        {   //  近すぎ
            tb  =   objs[j];
            d   =   t.p.subtract(tb.p);
            d.normalize(1.0);
            acp =   acp.add(d);
            ac++;
        }
        else if (   dis > 30    )
        {   //  遠すぎ
            tb  =   objs[j];
            d   =   t.p.subtract(tb.p);
            d.normalize(1.0);
            atp =   atp.add(d);
            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;
}

Get Adobe Flash player
どうやら、上手く?出来たようだ。
30以上離れているものは全て引き合うので、一つの群れが出来る事になる。

この動きを身近なところで見た事は無いだろうか?そう、草むら付近で遭遇頻度の高い虫柱(小さい羽虫が群れて飛んでいる塊)の動きに良く似ている。

近すぎると離れ、遠いと近寄る、というルールに沿うと動きが以前の「微生物」から「虫の群れ」に進化?した。

しかし、虫柱では長い事眺めていられない。やっぱり「気持ち悪い」と言われかねない。もっと優雅な動きに出来ないだろうか?


>> その5へ。

トラックバック(0)

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

コメントする

ホーム >> 左脳ActionScript3 >> アクションスクリプト3 >> boidデモを作る >> boidデモ作成 その4:「boids理論」遠くのものに近寄る。