146 lines
3.4 KiB
Plaintext
Raw Normal View History

2015-03-04 09:41:41 +01:00
import mathematik.*;
import processing.opengl.*;
import teilchen.BehaviorParticle;
import teilchen.Physics;
import teilchen.behavior.Arrival;
import teilchen.force.Spring;
import teilchen.force.ViscousDrag;
import teilchen.util.CollisionManager;
/**
* this demo shows how to add behaviors to particles. in this example the
* arrival behavior.
*/
Physics mPhysics;
ArrayList<Duckling> mDucklings;
CollisionManager mCollision;
void setup() {
size(640, 480, OPENGL);
frameRate(60);
smooth();
colorMode(RGB, 1.0f);
/* physics */
mPhysics = new Physics();
ViscousDrag myViscousDrag = new ViscousDrag();
myViscousDrag.coefficient = 0.25f;
mPhysics.add(myViscousDrag);
mCollision = new CollisionManager();
mCollision.minimumDistance(25);
/* ducklings */
mDucklings = new ArrayList<Duckling>();
for (int i = 0; i < 13; i++) {
final Duckling mDuckling = new Duckling();
if (!mDucklings.isEmpty()) {
mDuckling.arrival.setPositionRef(mDucklings.get(mDucklings.size()-1).particle.position());
}
mCollision.collision().add(mDuckling.particle);
mDucklings.add(mDuckling);
}
}
void draw() {
final float mDeltaTime = 1.0f / frameRate;
background(1);
/* update particles */
mCollision.createCollisionResolvers();
mCollision.loop(mDeltaTime);
mPhysics.step(mDeltaTime);
drawCollisionSprings();
mCollision.removeCollisionResolver();
mDucklings.get(0).arrival.oversteer(!mousePressed);
mDucklings.get(0).arrival.position().set(mouseX, mouseY);
/* draw */
for (int i=0; i < mDucklings.size(); i++) {
Duckling mDuckling = mDucklings.get(i);
drawParticle(mDuckling);
}
/* draw arrival */
stroke(0, 0.25f);
noFill();
ellipse(mDucklings.get(0).arrival.position().x,
mDucklings.get(0).arrival.position().y,
20, 20);
}
void drawParticle(Duckling pDuckling) {
final BehaviorParticle mParticle = pDuckling.particle;
final Arrival mArrival = pDuckling.arrival;
/* draw particle */
stroke(0, 0.5f);
noFill();
if (mArrival.arriving()) {
stroke(1, 0, 0, 0.5f);
}
if (mArrival.arrived()) {
stroke(0, 1, 0, 0.5f);
}
ellipse(mParticle.position().x, mParticle.position().y,
mParticle.radius() * 2, mParticle.radius() * 2);
/* - */
pushMatrix();
translate(mParticle.position().x,
mParticle.position().y);
/* draw velocity */
stroke(1, 0, 0, 0.5f);
line(0, 0, mParticle.velocity().x, mParticle.velocity().y);
/* draw break force */
stroke(0, 0.5f, 1, 0.5f);
line(0, 0, mArrival.force().x, mArrival.force().y);
/* - */
popMatrix();
}
void drawCollisionSprings() {
stroke(0, 1, 0, 0.25f);
for (int i = 0; i < mCollision.collision().forces().size(); ++i) {
if (mCollision.collision().forces().get(i) instanceof Spring) {
Spring mySpring = (Spring) mCollision.collision_forces().get(i);
line(mySpring.a().position().x, mySpring.a().position().y, mySpring.a().position().z,
mySpring.b().position().x, mySpring.b().position().y, mySpring.b().position().z);
}
}
}
class Duckling {
BehaviorParticle particle;
Arrival arrival;
Duckling() {
/* create particles */
particle = mPhysics.makeParticle(BehaviorParticle.class);
particle.position().set(random(width), random(height));
particle.maximumInnerForce(random(50, 150));
particle.radius(random(6, 10));
arrival = new Arrival();
arrival.breakforce(random(12, 28));
arrival.breakradius(random(45, 55));
particle.behaviors().add(arrival);
}
}