Processing으로 발광 표현을 시도했다.

3768 단어 processing

Processing을 사용하여 발광 표현을 사용해보십시오.



이 기사에서는 Processing을 사용하여 발광 표현을 이용한 작품 예를 소개합니다.

기법



Processing에서 발광 표현 라고 하는 기사의 코드를 이용하셔서, 이것을 클래스로 해 어레인지했습니다.

약간의 인터랙티브성을 갖게 하기 위해서, 마우스를 움직이면 구가 커지도록 쓰고 있습니다.

소스 코드도 올려 둡니다.
PImage img;
float t=0;
float amp;
float r=120;
float min_radius = 120;
float max_radius = 200;

pixel_circle[] c=new pixel_circle[6];

void setup(){
  fullScreen(P3D);
  frameRate(45); 
  hint(DISABLE_DEPTH_TEST);
  blendMode(ADD);
  imageMode(CENTER);
  for(int num=0;num<6;num++){
    img=createLight(random(0.6,0.9),random(0.3,0.5),random(0.6,0.8));
    c[num]=new pixel_circle(r,img);
  }
}

void draw(){
  background(15,20,50);
  translate(width/2,height/2,0);
  rotateX(frameCount*0.01);
  rotateY(frameCount*0.01);
  rotateZ(frameCount*0.01);
  translate(-width/4*amp,0,0);

  amp=cos(radians(t))*cos(radians(t));
  change_color(c,amp);
  r = change_radius(c,r);

  c[0].display();
  translate(width/2*amp,0,0);
  c[1].display();
  translate(-width/4*amp,width/4*amp,0);
  c[2].display();
  translate(0,-width/2*amp,0);
  c[3].display();
  translate(0,width/4*amp,-width/4*amp);
  c[4].display();
  translate(0,0,width/2*amp);
  c[5].display();

  t++;
}

void change_color(pixel_circle[] c,float amp){
  if(amp<0.002){
    for(int num=0;num<6;num++){
    c[num].change_color();
    }
  }
}

float change_radius(pixel_circle[] c,float r){
  if(dist(mouseX,mouseY,pmouseX,pmouseY)>0){
    r+=2;
    if(r>max_radius){
      r=max_radius;
    }
  }
  else{
    r-=2;
    if(r<min_radius){
      r=min_radius;
    }
  }
  for(int num=0;num<6;num++){
    c[num].change_radius(r);
  }
  return r;
}


PImage createLight(float rPower,float gPower,float bPower){
  int side=150;
  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((255*rPower)/distance);
      int g=int((255*gPower)/distance);
      int b=int((255*bPower)/distance);
      img.pixels[x+y*side]=color(r,g,b);
    }
  }
  return img;
}


class pixel_circle{
  float radius;
  float x,y,z;
  float velocity=0;

  PImage img1;

  pixel_circle(float radius1,PImage img2){
    radius=radius1;
    img1=img2;
  }

  void display(){
    float lastX=0,lastY=0,lastZ=0;
    float s=0,t=0;

    rotateX(frameCount*0.01);
    rotateY(frameCount*0.01);
    while(s<=180){
      float radianS=radians(s)%(2*PI);
      float radianT=radians(t)%(2*PI);
      float x=radius*sin(radianS)*cos(radianT);
      float y=radius*sin(radianS)*sin(radianT);
      float z=radius*cos(radianS);

      stroke(128);
      if(lastX!=0){
        strokeWeight(0.2);
        line(x,y,z,lastX,lastY,lastZ);
      }

      pushMatrix();
      translate(x,y,z);
      rotateY(-frameCount*0.01);
      rotateX(-frameCount*0.01);

      image(img1,0,0);
      popMatrix();

      lastX=x;
      lastY=y;
      lastZ=z;

      s++;
      t+=velocity;
    }
    rotateY(-frameCount*0.01);
    rotateX(-frameCount*0.01); 
    velocity+=0.04;
  }

  void change_color(){
    img1=createLight(random(0.5,0.8),random(0.5,0.8),random(0.5,0.8));
  }

  void change_radius(float r1){
    radius=r1;
  } 
}

결과





[추기] 다른 작품 도 줬습니다!

좋은 웹페이지 즐겨찾기