114 lines
2.8 KiB
Plaintext
Raw Permalink Normal View History

2015-03-04 09:41:41 +01:00
import processing.opengl.*;
import mathematik.Vector3f;
import teilchen.Particle;
import teilchen.Physics;
import teilchen.constraint.IConstraint;
import teilchen.constraint.Stick;
import teilchen.force.Attractor;
import teilchen.force.Gravity;
import teilchen.integration.Verlet;
Physics mPhysics;
Particle[][] mParticles;
final int GRID_WIDTH = 32;
final int GRID_HEIGHT = 16;
Attractor mAttractor;
void setup() {
size(640, 480, OPENGL);
frameRate(60);
mPhysics = new Physics();
mPhysics.contraint_iterations_per_steps = 5;
Verlet myVerlet = new Verlet();
myVerlet.damping(0.9f);
mPhysics.setInegratorRef(myVerlet);
mPhysics.add(new Gravity(new Vector3f(0, 1000f, 0)));
mAttractor = new Attractor();
mAttractor.strength(-15000);
mAttractor.radius(300);
mPhysics.add(mAttractor);
mParticles = new Particle[GRID_WIDTH][GRID_HEIGHT];
/* setup cloth */
float mGridStepX = ((float)width / GRID_WIDTH);
float mGridStepY = (((float)height * 0.5f) / GRID_HEIGHT);
for (int y = 0; y < GRID_HEIGHT; y++) {
for (int x = 0; x < GRID_WIDTH; x++) {
mParticles[x][y] = mPhysics.makeParticle();
mParticles[x][y].position().set((x + 0.5f) * mGridStepX,
y * mGridStepY,
random(0, 1));
mParticles[x][y].old_position().set(mParticles[x][y].position());
mParticles[x][y].mass(0.1f);
final float DAMPING = 0.9f;
if (y > 0) {
Stick myStick = new Stick(mParticles[x][y - 1],
mParticles[x][y],
mGridStepY);
myStick.damping(DAMPING);
mPhysics.add(myStick);
}
if (x > 0) {
Stick myStick = new Stick(mParticles[x - 1][y],
mParticles[x][y],
mGridStepX);
myStick.damping(DAMPING);
mPhysics.add(myStick);
}
if (x > 0 && y > 0) {
Stick myStick1 = new Stick(mParticles[x - 1][y - 1],
mParticles[x][y],
new Vector3f(mGridStepX, mGridStepY).length());
mPhysics.add(myStick1);
Stick myStick2 = new Stick(mParticles[x][y - 1],
mParticles[x - 1][y],
new Vector3f(mGridStepX, mGridStepY).length());
mPhysics.add(myStick2);
}
}
}
/* fix first row */
for (int x = 0; x < mParticles.length; x++) {
mParticles[x][0].fixed(true);
}
}
void draw() {
/* update */
mAttractor.position().set(mouseX, mouseY, 50);
mPhysics.step(1.0 / frameRate);
background(255);
/* draw sticks */
stroke(0, 127);
for (int i = 0; i < mPhysics.constraints().size(); i++) {
IConstraint mConstraint = mPhysics.constraints().get(i);
if (mConstraint instanceof Stick) {
final Stick myStick = (Stick)mConstraint;
line(myStick.a().position().x,
myStick.a().position().y,
myStick.a().position().z,
myStick.b().position().x,
myStick.b().position().y,
myStick.b().position().z);
}
}
}