int num = 200;
PImage[] img = new PImage[num];
float[] sz = new float[num];
float[] x = new float[num];
float[] y = new float[num];
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