114 lines
2.8 KiB
Plaintext
114 lines
2.8 KiB
Plaintext
|
|
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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|