Project3: Glass Slump Sim by Zack J-W
I became interested in glass slumping when some friends became interested in architectural cast and slumped glass.
Slumping is the process of heating glass and letting gravity pull it into a mold. Friends are working on a mold with a reconfigurable floor which moves via servos. Imagine a tile floor where each tile could raise to it’s own height.
One drawback to the process is that certain configurations push the glass beyond it’s physical limit. Another is that to test a new configuration in the real world is expensive in electricity, glass, and time. So a computer simulation is advantageous. Software does exist to do this but it can prohibitively expensive. I wanted to try building a cheap program that begins to simulate the effects of slumping glass.
Workflow:
In the end, a real simulation software would be much more sophisticated but I think this proves the power of an extensible open source program to begin competing with the proprietary stuff that costs 10’s of thousands of dollars.
Pros:
- The sim allows you to control time. That’s something you can’t get in a 15000 degree kiln.
- The sim is interactive. While it is possible to manipulate glass in mid-process, it would be much easier in sim.
- Some details, like the stretching of the material are working well.
- It’s fun, and fast compared to the real world version which is largely trial and error and a lot of the time, a failure
Cons:
- I didn’t make the jump to 3d. I will have to.
- As of now, it isn’t modeled on the mathematics of glass as a phase change material, but, oh well.
Demo:
[youtube https://www.youtube.com/watch?v=grTGPsiGhtw]
Code:
/*Simulation project for Golan Levin's I.A.C.D 2012 copywrite 2012 Zack Jacobson-Weaver...Uses ToxicLibs extensively! Toxiclibs.org Reset the whole show Increase the "heat" of the environment: excess of 15,000 deg F threatens catastrophic failure! */ import toxi.physics2d.constraints.*; import toxi.physics2d.behaviors.*; import toxi.physics2d.*; import toxi.geom.*; List springs; VisibleRectConstraint [] rects = new VisibleRectConstraint[20] ; PFont font; // number of particles for string float STRING_RES = 80; // number particles for ball int BALL_RES=24; // ball size int BALL_RADIUS=60; // squared snap distance for mouse selection float SNAP_DIST = 20 * 20; VerletPhysics2D physics; VerletParticle2D selectedParticle; float stn,rl; int temp; void setup() { size(680,480); springs = new ArrayList (); temp = 0; initPhysics(); } void draw() { // 1st update physics.update(); // then drawing background(255); // draw all springs for (int i=0; i 0) { VerletParticle2D q=physics.particles.get(i-1); VerletSpring2D s=new VerletSpring2D(p,q,delta*0.8,0.8); physics.addSpring(s); springs.add(s); } } // lock 1st & last particles physics.particles.get(0).lock(); physics.particles.get(physics.particles.size()-1).lock(); for (int i =0; i < rects.length; i++){ Rect R = new Rect(i*width/rects.length,random(height/4, height), width/rects.length,width/rects.length/2); VisibleRectConstraint r = new VisibleRectConstraint(R); VerletPhysics2D.addConstraintToAll(r,physics.particles); rects[i] = r; } } |
class VisibleRectConstraint extends RectConstraint { public VisibleRectConstraint(Rect r) { super(r); } public void draw() { stroke(184); strokeWeight(2); noFill(); rect(rect.x, rect.y, rect.width, rect.height); } } |