2016-05-29 2 views
0

J'ai essayé de faire quelque chose avec ce projet, je n'ai toujours échoué jusqu'à présent :) donc décidé de demander ici :)Traitement des particules

Je veux que les particules vont autour de l'ellipse de la classe Rock, non à travers elle mais autour de lui, comme une roche à l'intérieur d'une rivière que l'eau coule autour d'elle. Aucune suggestion ?

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

Je l'ai fait un peu de travail de mon propre sur hier et je suis proche de ce que je veux, a encore un peu issues.I visuelle veulent se débarrasser des bords du flux et quand je bouge la souris je peux encore voir les lignes de l'ellipse de la force. Voici le résultat.

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

} 



} 

Répondre

0

Je l'ai fait un peu de travail de mon propre sur hier et je suis proche de ce que je veux, a obtenu encore un peu issues.I visuelle veulent obtenir débarrasser des bords du flux et quand je bouge la souris je peux encore voir les lignes de l'ellipse de la force. Voici le résultat.

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

} 



} 
+0

Vous devriez ajouter cela comme une modification à votre question, et non une réponse, car il ne s'agit pas d'une réponse –

1

Commençons par quelque chose de plus basique:

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

Maintenant que nous avons cela, nous devons briser votre problème en étapes plus petites.

Étape 1: Ajoutez un "rocher" à l'esquisse. Nous allons nous mettre à la position de la souris:

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 

Étape 2: Ajouter logique qui détermine quand la particule se rapproche de la roche. Pour l'instant, il suffit de changer quelque chose de simple comme la couleur de la roche:

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

    ellipse(mouseX, mouseY, 100, 100); 

Étape 3: Maintenant que nous savons quand la particule est près de la roche, la logique ajouter pour déplacer la particule autour du rocher. Voici une approche très simple:

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

Vous pouvez faire cette logique beaucoup plus compliquée, et je vous recommande de jouer avec jusqu'à ce que vous trouviez l'effet escompté.

Mettre tous ensemble, il ressemble à ceci:

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; 
    } 
} 
+0

Merci :) mais je l'ai fait quelques changements peut-être vous pouvez me donner une idée de mon problème actuel – PoYo

+0

@PoYo Si vous avez un autre problème, s'il vous plaît poster une nouvelle question (faire un nouveau poste distinct de celui-ci) avec un [MCVE] (http://stackoverflow.com/help/mcve). Vous aurez aussi plus de chance si vous ** essayez quelque chose ** au lieu de simplement nous dire ce que vous voulez. –

+0

Eh bien, j'ai répondu à ma propre question et j'allais faire ce que vous avez suggéré, faire un nouveau message mais quelqu'un a commenté ma réponse et m'a dit que je ne devrais pas répondre à ma question mais l'ajouter comme modification à mon message original . – PoYo