processing3D旋转动画

int num = 50;  //粒子数量

ArrayList particles;

PVector Rotate;

Particle tempP;

void setup(){

  size(1080,680,P3D); //使用P3D,这样才能使用下面矩形旋转的功能

  colorMode(HSB);

  Rotate = new PVector();

  particles = new ArrayList();

  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);

  }

}

你可能感兴趣的:(processing3D旋转动画)