【Processing】createImage()を使ってみる

 

int num = 200;
PImage[] img = new PImage[num]; // 画像の変数
float[] sz = new float[num];  //サイズのための変数
float[] x = new float[num];  //xのための変数
float[] y = new float[num];  //yのための変数


void setup() {
  size(500, 500);
  imageMode(CENTER);//中心に表示する
  // 加算合成
  blendMode(ADD);
  smooth(8);
  // 画像の生成
  for(int i = 0; i < num; i++){
  sz[i] = random(70,200);
  img[i] = createLight(200,150, 150, 200);
  x[i] = random(width);
  y[i] = random(-100,height + 100);  
  }
}

// 光る球体の画像を生成する関数、サイズ、色情報
PImage createLight(int side,float rPower, float gPower, float bPower) {
  float center = side / 2.0; // 中心座標
  
  // 画像を生成
  PImage img = createImage(side, side, RGB);
  
  // 画像の一つ一つのピクセルの色を設定する
  for (int y = 0; y < side; y++) {
    for (int x = 0; x < side; x++) {
      //ピクセルの中心からの距離を求めて、中心ほど数値を大きくする
      float distance = (sq(center - x) + sq(center - y)) / 50.0;
      int r = int( rPower / distance );//赤色に適応
      int g = int( gPower / distance );//緑色に適応
      int b = int( bPower / distance );//青色に適応
      img.pixels[x + y * side] = color(r, g, b);
    }
  }
  return img; //イメージに処理を返す
}

void draw() {
  background(0, 15, 30);
  

for(int i = 0; i < num ; i ++){
  y[i] += sz[i]/100; //大きいのものは早く下に
  image(img[i],x[i],y[i],sz[i],sz[i]); //センターモードで表示、サイズ適応
  
  if(y[i] - 100 > height){ //画面より下に行ったら処理
    y[i] = 0 - 100;
    x[i] = random(width);
    sz[i] = random(100,200);
  }
}
}

 

雪が降るようなのでcreateImage()を使ってみる。擬似3D。

これは画像を作る関数で、PImage型のオブジェクトを作ってくれる。何に使うんだこれはと思っていたけど、下記のリファレンスを見てなるほど!と思った。GLSLぽい書き方をすることで発光する表現をすることができる。少し改変して使ってみた。

 

だけどこれ、サイズとピクセルをうまく調整しないと発光体の周りがジャギったりすることがある。たくさん使う場合は特に。なのであんまり上手に使えなかったかも。

 

リファレンス

p5aholic.hatenablog.com