92 lines
2.3 KiB
Plaintext
92 lines
2.3 KiB
Plaintext
|
|
import processing.opengl.*;
|
||
|
|
|
||
|
|
import mathematik.Vector3f;
|
||
|
|
|
||
|
|
import teilchen.Particle;
|
||
|
|
import teilchen.Physics;
|
||
|
|
import teilchen.constraint.Box;
|
||
|
|
import teilchen.force.Gravity;
|
||
|
|
import teilchen.force.Spring;
|
||
|
|
import teilchen.force.ViscousDrag;
|
||
|
|
import teilchen.util.CollisionManager;
|
||
|
|
|
||
|
|
static final float PARTICLE_SIZE = 12;
|
||
|
|
|
||
|
|
CollisionManager mCollision;
|
||
|
|
|
||
|
|
Physics mPhysics;
|
||
|
|
|
||
|
|
void setup() {
|
||
|
|
size(640, 480, OPENGL);
|
||
|
|
smooth();
|
||
|
|
frameRate(30);
|
||
|
|
noFill();
|
||
|
|
ellipseMode(CENTER);
|
||
|
|
|
||
|
|
mCollision = new CollisionManager();
|
||
|
|
mCollision.distancemode(CollisionManager.DISTANCE_MODE_FIXED);
|
||
|
|
mCollision.minimumDistance(50);
|
||
|
|
|
||
|
|
mPhysics = new Physics();
|
||
|
|
mPhysics.add(new ViscousDrag(0.85f));
|
||
|
|
mPhysics.add(new Gravity());
|
||
|
|
|
||
|
|
Box myBox = new Box();
|
||
|
|
myBox.min().set(50, 50, 0);
|
||
|
|
myBox.max().set(width - 50, height - 50, 0);
|
||
|
|
myBox.coefficientofrestitution(0.7f);
|
||
|
|
myBox.reflect(true);
|
||
|
|
mPhysics.add(myBox);
|
||
|
|
|
||
|
|
/* create a first particle */
|
||
|
|
final Particle myParticle = mPhysics.makeParticle(new Vector3f(mouseX, mouseY, 0), 10);
|
||
|
|
mCollision.collision().add(myParticle);
|
||
|
|
}
|
||
|
|
|
||
|
|
void draw() {
|
||
|
|
/* create particles */
|
||
|
|
if (mousePressed) {
|
||
|
|
final Particle myParticle = mPhysics.makeParticle(new Vector3f(mouseX, mouseY, 0), 10);
|
||
|
|
mCollision.collision().add(myParticle);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* collision handler */
|
||
|
|
final float mDeltaTime = 1.0 / frameRate;
|
||
|
|
mCollision.createCollisionResolvers();
|
||
|
|
mCollision.loop(mDeltaTime);
|
||
|
|
mPhysics.step(mDeltaTime);
|
||
|
|
|
||
|
|
/* draw */
|
||
|
|
background(255);
|
||
|
|
drawThings();
|
||
|
|
|
||
|
|
mCollision.removeCollisionResolver();
|
||
|
|
}
|
||
|
|
|
||
|
|
void drawThings() {
|
||
|
|
/* collision springs */
|
||
|
|
noFill();
|
||
|
|
stroke(255, 0, 127, 64);
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/* particles */
|
||
|
|
fill(245);
|
||
|
|
stroke(164);
|
||
|
|
for (int i = 0; i < mPhysics.particles().size(); ++i) {
|
||
|
|
Particle myParticle = mPhysics.particles().get(i);
|
||
|
|
pushMatrix();
|
||
|
|
translate(myParticle.position().x, myParticle.position().y, myParticle.position().z);
|
||
|
|
ellipse(0, 0,
|
||
|
|
PARTICLE_SIZE,
|
||
|
|
PARTICLE_SIZE);
|
||
|
|
popMatrix();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|