72 lines
1.9 KiB
Plaintext
72 lines
1.9 KiB
Plaintext
|
|
import processing.opengl.*;
|
||
|
|
|
||
|
|
import mathematik.*;
|
||
|
|
|
||
|
|
import teilchen.Particle;
|
||
|
|
import teilchen.Physics;
|
||
|
|
import teilchen.constraint.Stick;
|
||
|
|
import teilchen.force.Gravity;
|
||
|
|
import teilchen.integration.Verlet;
|
||
|
|
|
||
|
|
Physics mPhysics;
|
||
|
|
|
||
|
|
Particle[] mParticles;
|
||
|
|
|
||
|
|
void setup() {
|
||
|
|
size(640, 480, OPENGL);
|
||
|
|
frameRate(60);
|
||
|
|
smooth();
|
||
|
|
|
||
|
|
mPhysics = new Physics();
|
||
|
|
/* increase the number of iterations for contraints in each step. this can greatly relaxes tensions in the system. */
|
||
|
|
mPhysics.contraint_iterations_per_steps = 5;
|
||
|
|
|
||
|
|
/* add gravity for extra fun */
|
||
|
|
mPhysics.add(new Gravity());
|
||
|
|
|
||
|
|
/* we chose verlet integration as it integrates much more nicely with sticks ( and constraints in general ) */
|
||
|
|
Verlet myVerlet = new Verlet();
|
||
|
|
myVerlet.damping(0.99f);
|
||
|
|
mPhysics.setInegratorRef(myVerlet);
|
||
|
|
|
||
|
|
/* setup sticks to form a whip */
|
||
|
|
mParticles = new Particle[16];
|
||
|
|
float mSegmentLength = 20.0;
|
||
|
|
/* create root */
|
||
|
|
for (int x = 0; x < mParticles.length; x++) {
|
||
|
|
mParticles[x] = mPhysics.makeParticle(x * mSegmentLength, 0, 0, 0.1f);
|
||
|
|
if (x > 0) {
|
||
|
|
Stick myStick = new Stick(mParticles[x - 1],
|
||
|
|
mParticles[x],
|
||
|
|
mSegmentLength);
|
||
|
|
/* damp the stick to release tensions from the system */
|
||
|
|
myStick.damping(0.99f);
|
||
|
|
mPhysics.add(myStick);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/* fix root particle so it can stick to the mouse later */
|
||
|
|
mParticles[0].fixed(true);
|
||
|
|
}
|
||
|
|
|
||
|
|
void draw() {
|
||
|
|
/* stick root particle to mouse */
|
||
|
|
mParticles[0].position().set(mouseX, mouseY);
|
||
|
|
|
||
|
|
/* update */
|
||
|
|
mPhysics.step(1.0 / frameRate);
|
||
|
|
|
||
|
|
/* draw sticks with descending stroke weight */
|
||
|
|
background(255);
|
||
|
|
stroke(0, 192);
|
||
|
|
for (int x = 1; x < mParticles.length; x++) {
|
||
|
|
Particle p1 = mParticles[x - 1];
|
||
|
|
Particle p2 = mParticles[x];
|
||
|
|
final float mStrokeWeight = 4.0 * (1.0 - (float)x / mParticles.length);
|
||
|
|
strokeWeight(mStrokeWeight);
|
||
|
|
line(p1.position().x, p1.position().y, p1.position().z,
|
||
|
|
p2.position().x, p2.position().y, p2.position().z);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|