Processing Particle

匿名 (未验证) 提交于 2019-12-03 01:45:01

问题:

I've been trying to do something with this project I have but failed always so far :) so decided to ask here :)

I want the particles to go around the ellipse from Rock class, not through it but around it, like a rock inside a river that water flows around it. Any suggestions ?

int NUM_PARTICLES = 1000; ParticleSystem p; Rock r; void setup() {   smooth();   fullScreen(P2D);   //size(700,700,P2D);   //background(0);   p = new ParticleSystem();   r = new Rock(); }  void draw() {   background(0);   p.update();   p.render();   r.rock();  }  float speed = 1; class Particle {   PVector position, velocity;    Particle()   {     position = new PVector(random(width),random(height));     velocity = new PVector();   }    void update()   {     velocity.x = speed*(noise(position.y));     velocity.y = speed*(noise(position.x));     position.add(velocity);      if(position.x<0)position.x+=width;     if(position.x>width)position.x-=width;     if(position.y<0)position.y+=height;     if(position.y>height)position.y-=height;   }    void render()   {     stroke(0, 0, 255, 80);     line(position.x,position.y,position.x-velocity.x,position.y-velocity.y);   } }  class ParticleSystem {   Particle[] particles;    ParticleSystem()   {     particles = new Particle[NUM_PARTICLES];     for(int i = 0; i < NUM_PARTICLES; i++)     {       particles[i]= new Particle();     }   }    void update()   {     for(int i = 0; i < NUM_PARTICLES; i++)     {       particles[i].update();     }   }    void render()   {     for(int i = 0; i < NUM_PARTICLES; i++)     {       particles[i].render();     }   } } class Rock{    void rock()   {   noFill();   stroke(255);   strokeWeight(4);   ellipse(mouseX,mouseY,50,50);  }    } 

EDIT: 1

I did some work of my own on it yesterday and i am close to what I want, still got some visual issues.I want to get rid of the edges of the flow and when I move the mouse I can still see the lines of the ellipse from the force. Here is the result.

int NUM_PARTICLES = 9000; ParticleSystem p; Rock r; void setup() {   smooth();   size(700,700,P2D);   p = new ParticleSystem();   r = new Rock(); }  void draw() {   background(0);   p.update();   p.render();   r.rock();  }  float speed = 2; float rad = 100; class Particle {   PVector position, velocity;   float initialPosY;    Particle()   {     position = new PVector(random(width), random(height));     initialPosY = position.y;     velocity = new PVector();   }    void update()   {      velocity.x = speed;     velocity.y = 0;      float d = dist (position.x, position.y, mouseX, mouseY);     if (d < rad) {       float force = map(d, 0, rad, speed, 0);       if (position.x < mouseX) {         if (position.y < mouseY) {           velocity.y = -force;         } else {           velocity.y = force;         }       } else {         if (position.y < mouseY) {           velocity.y = force;         } else {           velocity.y = -force;         }       }       position.add(velocity);     } else {       position = new PVector(position.x+speed, initialPosY);     }        if (position.x<0)position.x+=width;     if (position.x>width)position.x-=width;     if (position.y<0)position.y+=height;     if (position.y>height)position.y-=height;   }    void render()   {     stroke(255, 255, 255, 80);     point(position.x, position.y);   } }  class ParticleSystem {   Particle[] particles;    ParticleSystem()   {     particles = new Particle[NUM_PARTICLES];     for (int i = 0; i < NUM_PARTICLES; i++)     {       particles[i]= new Particle();     }   }    void update()   {     for (int i = 0; i < NUM_PARTICLES; i++)     {       particles[i].update();     }   }    void render()   {     for (int i = 0; i < NUM_PARTICLES; i++)     {       particles[i].render();     }   } }  class Rock{    void rock()   {   noFill();   stroke(255);   strokeWeight(4);   ellipse(mouseX,mouseY,50,50);  }    } 

回答1:

Let's start out with something more basic:

PVector position; PVector speed;  void setup() {   size(500, 500);   position = new PVector(250, 0);   speed = new PVector(0, 1); }  void draw() {    background(0);    ellipse(position.x, position.y, 20, 20);    position.add(speed);    if (position.y > height) {     position.y = 0;   }    if (position.x < 0) {     position.x = width;   } else if (position.x > width) {     position.x = 0;   } } 

Now that we have this, we need to break your problem down into smaller steps.

Step 1: Add a "rock" to the sketch. Let's put ours at the mouse position:

void draw() {    background(0);    fill(0, 255, 0);   ellipse(mouseX, mouseY, 100, 100);    fill(0, 0, 255);   ellipse(position.x, position.y, 20, 20);    position.add(speed);    //rest of code unchanged 

Step 2: Add logic that determines when the particle is getting close to the rock. For now, just do something simple like change the rock's color:

  if(dist(position.x, position.y, mouseX, mouseY) < 100){     fill(255, 0, 0);   }   else{     fill(0, 255, 0);   }    ellipse(mouseX, mouseY, 100, 100); 

Step 3: Now that we know when the particle is near the rock, add logic for moving the particle around the rock. Here is a very basic approach:

  if (dist(position.x, position.y, mouseX, mouseY) < 100) {     fill(255, 0, 0);     if (position.x < mouseX) {       position.x--;     } else {       position.x++;     }   } else {     fill(0, 255, 0);   } 

You could make this logic much more complicated, and I recommend playing with it until you find the right effect.

Putting it all together, it looks like this:

PVector position; PVector speed;  void setup() {   size(500, 500);   position = new PVector(250, 0);   speed = new PVector(0, 1); }  void draw() {    background(0);    if (dist(position.x, position.y, mouseX, mouseY) < 100) {     fill(255, 0, 0);     if (position.x < mouseX) {       position.x--;     } else {       position.x++;     }   } else {     fill(0, 255, 0);   }    ellipse(mouseX, mouseY, 100, 100);    fill(0, 0, 255);   ellipse(position.x, position.y, 20, 20);    position.add(speed);    if (position.y > height) {     position.y = 0;   }    if (position.x < 0) {     position.x = width;   } else if (position.x > width) {     position.x = 0;   } } 


回答2:

I did some work of my own on it yesterday and i am close to what I want, still got some visual issues.I want to get rid of the edges of the flow and when I move the mouse I can still see the lines of the ellipse from the force. Here is the result.

int NUM_PARTICLES = 9000; ParticleSystem p; Rock r; void setup() {   smooth();   size(700,700,P2D);   p = new ParticleSystem();   r = new Rock(); }  void draw() {   background(0);   p.update();   p.render();   r.rock();  }  float speed = 2; float rad = 100; class Particle {   PVector position, velocity;   float initialPosY;    Particle()   {     position = new PVector(random(width), random(height));     initialPosY = position.y;     velocity = new PVector();   }    void update()   {      velocity.x = speed;     velocity.y = 0;      float d = dist (position.x, position.y, mouseX, mouseY);     if (d < rad) {       float force = map(d, 0, rad, speed, 0);       if (position.x < mouseX) {         if (position.y < mouseY) {           velocity.y = -force;         } else {           velocity.y = force;         }       } else {         if (position.y < mouseY) {           velocity.y = force;         } else {           velocity.y = -force;         }       }       position.add(velocity);     } else {       position = new PVector(position.x+speed, initialPosY);     }        if (position.x<0)position.x+=width;     if (position.x>width)position.x-=width;     if (position.y<0)position.y+=height;     if (position.y>height)position.y-=height;   }    void render()   {     stroke(255, 255, 255, 80);     point(position.x, position.y);   } }  class ParticleSystem {   Particle[] particles;    ParticleSystem()   {     particles = new Particle[NUM_PARTICLES];     for (int i = 0; i < NUM_PARTICLES; i++)     {       particles[i]= new Particle();     }   }    void update()   {     for (int i = 0; i < NUM_PARTICLES; i++)     {       particles[i].update();     }   }    void render()   {     for (int i = 0; i < NUM_PARTICLES; i++)     {       particles[i].render();     }   } }  class Rock{    void rock()   {   noFill();   stroke(255);   strokeWeight(4);   ellipse(mouseX,mouseY,50,50);  }    } 


文章来源: Processing Particle
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!