Processing으로 불꽃 놀이
3371 단어 processing
Processing으로 불꽃놀이 발사
여름입니다. 불꽃 놀이의 계절입니다! 이번에는 Processing에서 불꽃놀이를 연출해 보았습니다!
개요
방금 게시한 기사 하지만 발광 표현을 다루었습니다만, 이번은 오리지널을 소개합니다.
키 입력에 의해 불꽃놀이가 쏟아지게 되어 있습니다.
가속도 센서 등 각종 센서와 연계하여 불꽃을 발사하는 것도 재미 있습니다!
소스 코드도 붙여 둡니다. (※당초보다 조금 정리했습니다)
ArrayList<Fireworks> fireworks=new ArrayList<Fireworks>();
void setup () {
fullScreen(P3D);
frameRate(50);
hint(DISABLE_DEPTH_TEST);
blendMode(ADD);
imageMode(CENTER);
}
void draw () {
background(0,0,40);
for(int i=0;i<fireworks.size();i++){
Fireworks art=fireworks.get(i);
if(art.centerPosition.y-art.radius>height){
fireworks.remove(i);
}
art.display();
art.update();
}
}
void keyPressed(){
fireworks.add(new Fireworks(80));
}
//発光表現の元となるクラス
PImage createLight(float rPower,float gPower,float bPower){
int side=64;
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))/10.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 Fireworks{
//花火の火の数
int num=512;
//花火の中心の初期位置
PVector centerPosition=new PVector(random(width/8,width*7/8),random(height/2,height*4/5),random(-100,100));
//花火の中心の初期速度
PVector velocity=new PVector(0,-22,0);
//重力
PVector accel=new PVector(0,0.4,0);
PImage img;
float radius;
PVector[] firePosition=new PVector[num];
Fireworks(float r){
float cosTheta;
float sinTheta;
float phi;
float colorchange=random(0,5);
radius=r;
for (int i=0;i<num;i++){
cosTheta = random(0,1) * 2 - 1;
sinTheta = sqrt(1- cosTheta*cosTheta);
phi = random(0,1) * 2 * PI;
firePosition[i]=new PVector(radius * sinTheta * cos(phi),radius * sinTheta * sin(phi),radius * cosTheta);
firePosition[i]=PVector.mult(firePosition[i],1.12);
}
//色をランダムで初期化(綺麗な色が出やすいように調整)
if(colorchange>=3.8){
img=createLight(0.9,random(0.2,0.5),random(0.2,0.5));
}else if(colorchange>3.2){
img=createLight(random(0.2,0.5),0.9,random(0.2,0.5));
}else if(colorchange>2){
img=createLight(random(0.2,0.5),random(0.2,0.5),0.9);
} else {
img=createLight(random(0.5,0.8),random(0.5,0.8),random(0.5,0.8));
}
}
void display(){
for (int i=0;i<num;i++){
pushMatrix();
translate(centerPosition.x,centerPosition.y,centerPosition.z);
translate(firePosition[i].x,firePosition[i].y,firePosition[i].z);
image(img,0,0);
popMatrix();
firePosition[i]=PVector.mult(firePosition[i],1.015);
}
}
void update(){
radius=dist(0,0,0,firePosition[0].x,firePosition[0].y,firePosition[0].z);
centerPosition.add(velocity);
velocity.add(accel);
}
}
결과
여러분도 예술의 힘으로 이번 여름을 더욱 고조합시다!
Reference
이 문제에 관하여(Processing으로 불꽃 놀이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mikittt/items/776e6f2a114866386b54
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
방금 게시한 기사 하지만 발광 표현을 다루었습니다만, 이번은 오리지널을 소개합니다.
키 입력에 의해 불꽃놀이가 쏟아지게 되어 있습니다.
가속도 센서 등 각종 센서와 연계하여 불꽃을 발사하는 것도 재미 있습니다!
소스 코드도 붙여 둡니다. (※당초보다 조금 정리했습니다)
ArrayList<Fireworks> fireworks=new ArrayList<Fireworks>();
void setup () {
fullScreen(P3D);
frameRate(50);
hint(DISABLE_DEPTH_TEST);
blendMode(ADD);
imageMode(CENTER);
}
void draw () {
background(0,0,40);
for(int i=0;i<fireworks.size();i++){
Fireworks art=fireworks.get(i);
if(art.centerPosition.y-art.radius>height){
fireworks.remove(i);
}
art.display();
art.update();
}
}
void keyPressed(){
fireworks.add(new Fireworks(80));
}
//発光表現の元となるクラス
PImage createLight(float rPower,float gPower,float bPower){
int side=64;
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))/10.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 Fireworks{
//花火の火の数
int num=512;
//花火の中心の初期位置
PVector centerPosition=new PVector(random(width/8,width*7/8),random(height/2,height*4/5),random(-100,100));
//花火の中心の初期速度
PVector velocity=new PVector(0,-22,0);
//重力
PVector accel=new PVector(0,0.4,0);
PImage img;
float radius;
PVector[] firePosition=new PVector[num];
Fireworks(float r){
float cosTheta;
float sinTheta;
float phi;
float colorchange=random(0,5);
radius=r;
for (int i=0;i<num;i++){
cosTheta = random(0,1) * 2 - 1;
sinTheta = sqrt(1- cosTheta*cosTheta);
phi = random(0,1) * 2 * PI;
firePosition[i]=new PVector(radius * sinTheta * cos(phi),radius * sinTheta * sin(phi),radius * cosTheta);
firePosition[i]=PVector.mult(firePosition[i],1.12);
}
//色をランダムで初期化(綺麗な色が出やすいように調整)
if(colorchange>=3.8){
img=createLight(0.9,random(0.2,0.5),random(0.2,0.5));
}else if(colorchange>3.2){
img=createLight(random(0.2,0.5),0.9,random(0.2,0.5));
}else if(colorchange>2){
img=createLight(random(0.2,0.5),random(0.2,0.5),0.9);
} else {
img=createLight(random(0.5,0.8),random(0.5,0.8),random(0.5,0.8));
}
}
void display(){
for (int i=0;i<num;i++){
pushMatrix();
translate(centerPosition.x,centerPosition.y,centerPosition.z);
translate(firePosition[i].x,firePosition[i].y,firePosition[i].z);
image(img,0,0);
popMatrix();
firePosition[i]=PVector.mult(firePosition[i],1.015);
}
}
void update(){
radius=dist(0,0,0,firePosition[0].x,firePosition[0].y,firePosition[0].z);
centerPosition.add(velocity);
velocity.add(accel);
}
}
결과
여러분도 예술의 힘으로 이번 여름을 더욱 고조합시다!
Reference
이 문제에 관하여(Processing으로 불꽃 놀이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mikittt/items/776e6f2a114866386b54
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Processing으로 불꽃 놀이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mikittt/items/776e6f2a114866386b54텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)