int num = 50; //粒子数量
ArrayList<Particle> particles;
PVector Rotate;
Particle tempP;
void setup(){
size(1080,680,P3D); //使用P3D,这样才能使用下面矩形旋转的功能
colorMode(HSB);
Rotate = new PVector();
particles = new ArrayList<Particle>();
for(int i = 0; i < num; i++){
particles.add( new Particle() );
}
background(255);
}
void draw(){
// 下面3行制造画面的残影效果。如果不用残影的话就是直接画个background
noStroke();
fill(255, 18);
rect(0,0,width,height);
//下面给矩阵计算3个轴向的旋转,根据时间来变化
Rotate = new PVector(frameCount*0.003, frameCount*0.04, frameCount*0.03);
pushMatrix();
translate(width/2, height/2);//这个……不用我在这里解释了吧,官方教程可以2分钟看懂。看懂这行再看下面的内容吧
rotateX(Rotate.x);//把上面计算出来的旋转值分配进去
rotateY(Rotate.y);
rotateZ(Rotate.z);
//刷新粒子类
for(int i = particles.size()-1; i >= 0; i--){
tempP = particles.get(i);
tempP.move();
}
popMatrix();
}
class Particle{
PVector pos,radian;
float dis,h,s,b;
float _weight = 18;//粒子的半径
Particle(){
//随机给每个粒子定义它在假想中的球体上的弧度,供下面去算具体的坐标
radian = new PVector(random(TWO_PI), random(TWO_PI));
pos = new PVector();
dis = 160;//假想球体的半径
}
void move(){
update();
display();
}
void update(){
//这就是Google上的公式,通过随机出来的弧度获得其具体坐标
pos.x = dis*sin(radian.x)*cos(radian.y);
pos.y = dis*cos(radian.x)*cos(radian.y);
pos.z = dis*sin(radian.y);
}
void display(){
//随便写了点颜色变化,感兴趣的可以看看
h = noise(radian.x*0.3, frameCount*0.012)*95 + 130 + map(mouseX, 0 ,width, -20, 20);
noStroke();
fill(h,85,255);
//下面是用 sphere() 来画粒子,不能像 point() 一样直接指定坐标,sphere()只能在原点画。所以在这里要临时移动一下矩阵,画完再把矩阵挪回去。
translate(pos.x,pos.y,pos.z);
sphere(_weight);
translate(-pos.x,-pos.y,-pos.z);
}
}
网友评论