6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Processingを使った光の絨毯

Posted at

111.jpg

noise()を使ってパーティクルの波をランダムに発生させ、宇宙空間ぽくしました。
今回は3次元なので、x軸、y軸、z軸にパーリンノイズを生成するためにnoise(x,y,z)として、各パラメータを取得しました。

noise() ノイズの生成

 コンピュータグラフィクスで自然物を表現するときのテクスチャや地形描写などで使われるパーリンノイズの生成に使います。

【構文】
noise(x)
noise(x, y)
noise(x, y, z)

【パラメータ】
x ノイズ空間におけるx座標(float)
y ノイズ空間におけるy座標(float)
z ノイズ空間におけるz座標(float)

【戻り値】
0.0から1.0の間の値(float)

またlerp関数を使用して、-speedとspeedの間の値を取得しました。
lerp(a, b, c)・・・aとbの間の、比cで指定される値を求める

p5.pde
int nPoints=30000;
float complexity =3;
float maxMass=0.05;
float timeSpeed=0.002;
float phase=PI;

float windSpeed=70;
int step=10;

float[] pollenMass;
float[][] points;

void setup(){
  //size(500,400,P3D);
  size(displayWidth, displayHeight,P3D);
  background(0);
  frameRate(30);
  points=new float[nPoints][2];
  pollenMass=new float[nPoints];
  
  for(int i=0;i<nPoints;i++){
    points[i]=new float[]{
     random(0,width),random(0,height) 
    };
    pollenMass[i]=noise(0,maxMass);
  }
}

void draw(){
  background(0);
  stroke(255);
  smooth();
  
  //camera(mouseX, mouseY, 220.0, width/2, height/2, height/2, 1, 1, 1);
  
  for(int i=0; i<nPoints; i++){
  pushMatrix();
    float x = points[i][0];
    float y = points[i][1];
    float z = points[i][1];

    float normx = norm(x, 0, width);
    float normy = norm(y, 0, height);
    float normz = norm(z, 0, -1000);
    float u = noise(phase, normx * complexity, normy * complexity);
    float v = noise(phase, normy * complexity, normz * complexity);
    float w = noise(phase, normz * complexity, normx * complexity);
    float speed = (1 + noise(u, v, w)) / pollenMass[i];
    x += lerp(-speed, speed, u);
    y += lerp(-speed, speed, v);
    z += lerp(-speed, speed, w);

    strokeWeight(z/random(100, 500));
    point(x, y, z);
    //image(particleImg, x, y, 30, 30);

    points[i][0] = x;
    points[i][1] = y;
    points[i][1] = z;
    popMatrix();
  
  }
}

void mousePressed(){
  setup();
}

void keyPressed() {
  if ( key == ' ' ) {
    save( "hoge.png" );
  }
}

またパーティクルの数(nPoints)は30000としていますが、
これ以上増やすと自分のマシンが遅くなるので、とりあえずこの数にしています。
もっと増やすと綺麗になりますが、処理落ちしてしまうので、この辺りは数を増やしたり減らしたりして、さじ加減が必要になるかと思います。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?