not good but great

プログラミング、アート、映画・本の感想について書きます。

一番近いベクトルから力を受けて、パーティクルを動かす

demo


吸い込まれるような動きを演出したかったのですが、そこまですることはできなかったです。マウスドラッグすると、マウスポインタを中心とした円に白いパーティクルがあったときは、一番近い、緑のベクトルから力を受けるという動きをします。それによって、緑の点の合間を縫って、白い点が動いているように見えました。

code

ofVec2f vectorField::getForce(float posX, float posY){
    //白いパーティクルの位置ベクトル
    ofVec2f pa;
    pa.set(posX,posY);
    
    //受ける力のベクトル
    ofVec2f frc;
    frc.set(0,0);
    //画面の大きさに対しての相対位置
    float xPct = posX / (float)screenWidth;
    float yPct = posY / (float)screenHeight;
    float radiusPct = radius / (float)screenWidth;
    
    //横から何番目の緑のベクトルか
    int fieldPosX = (int)(xPct * fieldRow);
    //縦から何番目の緑のベクトルか
    int fieldPosY = (int)(yPct * fieldCol);
    
    //一番近いベクトルのインデックス
    int pos = fieldPosX + fieldPosY * fieldRow;
    //グリッド上の点
    float fx = field[pos].x;
    float fy = field[pos].y;
    
    //方向ベクトルを作成
    ofVec2f directionVec = pa - field[pos];
    //単位ベクトルにする
    directionVec.normalize();
    //受ける力
    float strength = 1;
    float strongness = strength * (1.0f - (distance[pos] / radius));
    
    frc.x += strongness * directionVec.x;
    frc.y += strongness * directionVec.y;
    return frc;
}

画面の相対位置から緑のベクトルが入った配列のインデックス番号を探すのは、最初分かりにくいかもしれません。yoppaさんのコードを参考にしました。

・参考
http://yoppa.org/ma2_13/5022.html