//
import render.*;
public class MeltingPot extends RenderApplet
{
Geometry teapot, can;
public void initialize() {
setBgColor(.25,.25,1);
setFL(15);
setFOV(.8);
Material baseColor = new Material();
baseColor.setColor(.5,.5,.5).setAmbient(.5,.5,.5);
push();
translate(0,.4,0);
rotateX(.2);
transform(world);
pop();
Geometry base = world.add().ball(30).superquadric(10,.2).setMaterial(baseColor);
push();
rotateY(Math.PI/6);
translate(.1,-5.2,-.16);
scale(4,4,2.9);
transform(base);
pop();
Material red = new Material();
red.setColor(0,0,0, .8,0,0,10).setAmbient(.5,0,0);
teapot = world.add();
push();
translate(0,-1,0);
rotateX(-Math.PI/2);
scale(.03,.03,.03);
transform(teapot);
pop();
for (int i = 0 ; i < teapot_data.length ; i++) {
Geometry s = teapot.add();
int m = 8, n = i < 12 ? 16 : 8;
s.patch(m,n, Geometry.Bezier, teapot_data[i]).setMaterial(red);
}
addLight( 1, 0, 0, .7,.8,.7);
addLight(-1, 0, 0, .7,.8,.7);
addLight( 0, 1, 0, .8,.8,.9);
addLight( 0,-1, 0, .3,.3,.4);
addLight( 0, 0, 1, .3,.3,.25);
addLight( 0, 0,-1, .3,.3,.25);
}
double getSize(double data[]) {
double min[] = {1000,1000,1000}, max[] = {-1000,-1000,-1000};
for (int n = 0 ; n < 16 ; n++)
for (int k = 0 ; k < 3 ; k++) {
min[k] = Math.min(min[k], data[3*n + k]);
max[k] = Math.max(max[k], data[3*n + k]);
}
return Math.max(Math.max(max[0]-min[0], max[1]-min[1]), max[2]-min[2]);
}
double prevTime = 0, melt = 1;
public void animate(double time) {
if (prevTime == 0)
prevTime = time;
double dt = time - prevTime;
prevTime = time;
melt *= 1 - .1 * dt;
double m = Math.pow(melt,.1);
if (melt < .5)
m = Math.pow(.5,.1);
for (int i = 0 ; i < teapot.child.length ; i++) {
teapot.child[i].noiseOrigin[0] += 2*dt;
teapot.child[i].addImprovedNoise(.02,.1);
teapot.child[i].computeMeshNormals();
teapot.child[i].addImprovedNoise(.04,.12);
teapot.child[i].computeMeshNormals();
push();
translate(0,0, -10 * (1-melt));
scale(1/m,1/m,Math.pow(melt,.5));
transform(teapot.child[i]);
pop();
}
}
double teapot_data[][] = {
{ // 0
-80.00, 0.00, 30.00, -80.00, -44.80, 30.00, -44.80, -80.00, 30.00, 0.00, -80.00, 30.00,
-80.00, 0.00, 12.00, -80.00, -44.80, 12.00, -44.80, -80.00, 12.00, 0.00, -80.00, 12.00,
-60.00, 0.00, 3.00, -60.00, -33.60, 3.00, -33.60, -60.00, 3.00, 0.00, -60.00, 3.00,
-60.00, 0.00, 0.00, -60.00, -33.60, 0.00, -33.60, -60.00, 0.00, 0.00, -60.00, 0.00,
},{
0.00, -80.00, 30.00, 44.80, -80.00, 30.00, 80.00, -44.80, 30.00, 80.00, 0.00, 30.00,
0.00, -80.00, 12.00, 44.80, -80.00, 12.00, 80.00, -44.80, 12.00, 80.00, 0.00, 12.00,
0.00, -60.00, 3.00, 33.60, -60.00, 3.00, 60.00, -33.60, 3.00, 60.00, 0.00, 3.00,
0.00, -60.00, 0.00, 33.60, -60.00, 0.00, 60.00, -33.60, 0.00, 60.00, 0.00, 0.00,
},{
-60.00, 0.00, 90.00, -60.00, -33.60, 90.00, -33.60, -60.00, 90.00, 0.00, -60.00, 90.00,
-70.00, 0.00, 69.00, -70.00, -39.20, 69.00, -39.20, -70.00, 69.00, 0.00, -70.00, 69.00,
-80.00, 0.00, 48.00, -80.00, -44.80, 48.00, -44.80, -80.00, 48.00, 0.00, -80.00, 48.00,
-80.00, 0.00, 30.00, -80.00, -44.80, 30.00, -44.80, -80.00, 30.00, 0.00, -80.00, 30.00,
},{
0.00, -60.00, 90.00, 33.60, -60.00, 90.00, 60.00, -33.60, 90.00, 60.00, 0.00, 90.00,
0.00, -70.00, 69.00, 39.20, -70.00, 69.00, 70.00, -39.20, 69.00, 70.00, 0.00, 69.00,
0.00, -80.00, 48.00, 44.80, -80.00, 48.00, 80.00, -44.80, 48.00, 80.00, 0.00, 48.00,
0.00, -80.00, 30.00, 44.80, -80.00, 30.00, 80.00, -44.80, 30.00, 80.00, 0.00, 30.00,
},{
-56.00, 0.00, 90.00, -56.00, -31.36, 90.00, -31.36, -56.00, 90.00, 0.00, -56.00, 90.00,
-53.50, 0.00, 95.25, -53.50, -29.96, 95.25, -29.96, -53.50, 95.25, 0.00, -53.50, 95.25,
-57.50, 0.00, 95.25, -57.50, -32.20, 95.25, -32.20, -57.50, 95.25, 0.00, -57.50, 95.25,
-60.00, 0.00, 90.00, -60.00, -33.60, 90.00, -33.60, -60.00, 90.00, 0.00, -60.00, 90.00,
},{ // 5
0.00, -56.00, 90.00, 31.36, -56.00, 90.00, 56.00, -31.36, 90.00, 56.00, 0.00, 90.00,
0.00, -53.50, 95.25, 29.96, -53.50, 95.25, 53.50, -29.96, 95.25, 53.50, 0.00, 95.25,
0.00, -57.50, 95.25, 32.20, -57.50, 95.25, 57.50, -32.20, 95.25, 57.50, 0.00, 95.25,
0.00, -60.00, 90.00, 33.60, -60.00, 90.00, 60.00, -33.60, 90.00, 60.00, 0.00, 90.00,
},{
80.00, 0.00, 30.00, 80.00, 44.80, 30.00, 44.80, 80.00, 30.00, 0.00, 80.00, 30.00,
80.00, 0.00, 12.00, 80.00, 44.80, 12.00, 44.80, 80.00, 12.00, 0.00, 80.00, 12.00,
60.00, 0.00, 3.00, 60.00, 33.60, 3.00, 33.60, 60.00, 3.00, 0.00, 60.00, 3.00,
60.00, 0.00, 0.00, 60.00, 33.60, 0.00, 33.60, 60.00, 0.00, 0.00, 60.00, 0.00,
},{
0.00, 80.00, 30.00, -44.80, 80.00, 30.00, -80.00, 44.80, 30.00, -80.00, 0.00, 30.00,
0.00, 80.00, 12.00, -44.80, 80.00, 12.00, -80.00, 44.80, 12.00, -80.00, 0.00, 12.00,
0.00, 60.00, 3.00, -33.60, 60.00, 3.00, -60.00, 33.60, 3.00, -60.00, 0.00, 3.00,
0.00, 60.00, 0.00, -33.60, 60.00, 0.00, -60.00, 33.60, 0.00, -60.00, 0.00, 0.00,
},{
60.00, 0.00, 90.00, 60.00, 33.60, 90.00, 33.60, 60.00, 90.00, 0.00, 60.00, 90.00,
70.00, 0.00, 69.00, 70.00, 39.20, 69.00, 39.20, 70.00, 69.00, 0.00, 70.00, 69.00,
80.00, 0.00, 48.00, 80.00, 44.80, 48.00, 44.80, 80.00, 48.00, 0.00, 80.00, 48.00,
80.00, 0.00, 30.00, 80.00, 44.80, 30.00, 44.80, 80.00, 30.00, 0.00, 80.00, 30.00,
},{
0.00, 60.00, 90.00, -33.60, 60.00, 90.00, -60.00, 33.60, 90.00, -60.00, 0.00, 90.00,
0.00, 70.00, 69.00, -39.20, 70.00, 69.00, -70.00, 39.20, 69.00, -70.00, 0.00, 69.00,
0.00, 80.00, 48.00, -44.80, 80.00, 48.00, -80.00, 44.80, 48.00, -80.00, 0.00, 48.00,
0.00, 80.00, 30.00, -44.80, 80.00, 30.00, -80.00, 44.80, 30.00, -80.00, 0.00, 30.00,
},{ // 10
56.00, 0.00, 90.00, 56.00, 31.36, 90.00, 31.36, 56.00, 90.00, 0.00, 56.00, 90.00,
53.50, 0.00, 95.25, 53.50, 29.96, 95.25, 29.96, 53.50, 95.25, 0.00, 53.50, 95.25,
57.50, 0.00, 95.25, 57.50, 32.20, 95.25, 32.20, 57.50, 95.25, 0.00, 57.50, 95.25,
60.00, 0.00, 90.00, 60.00, 33.60, 90.00, 33.60, 60.00, 90.00, 0.00, 60.00, 90.00,
},{
0.00, 56.00, 90.00, -31.36, 56.00, 90.00, -56.00, 31.36, 90.00, -56.00, 0.00, 90.00,
0.00, 53.50, 95.25, -29.96, 53.50, 95.25, -53.50, 29.96, 95.25, -53.50, 0.00, 95.25,
0.00, 57.50, 95.25, -32.20, 57.50, 95.25, -57.50, 32.20, 95.25, -57.50, 0.00, 95.25,
0.00, 60.00, 90.00, -33.60, 60.00, 90.00, -60.00, 33.60, 90.00, -60.00, 0.00, 90.00,
},{
-64.00, 0.00, 75.00, -64.00, 12.00, 75.00, -60.00, 12.00, 84.00, -60.00, 0.00, 84.00,
-92.00, 0.00, 75.00, -92.00, 12.00, 75.00, -100.00, 12.00, 84.00, -100.00, 0.00, 84.00,
-108.00, 0.00, 75.00, -108.00, 12.00, 75.00, -120.00, 12.00, 84.00, -120.00, 0.00, 84.00,
-108.00, 0.00, 66.00, -108.00, 12.00, 66.00, -120.00, 12.00, 66.00, -120.00, 0.00, 66.00,
},{
-60.00, 0.00, 84.00, -60.00, -12.00, 84.00, -64.00, -12.00, 75.00, -64.00, 0.00, 75.00,
-100.00, 0.00, 84.00, -100.00, -12.00, 84.00, -92.00, -12.00, 75.00, -92.00, 0.00, 75.00,
-120.00, 0.00, 84.00, -120.00, -12.00, 84.00, -108.00, -12.00, 75.00, -108.00, 0.00, 75.00,
-120.00, 0.00, 66.00, -120.00, -12.00, 66.00, -108.00, -12.00, 66.00, -108.00, 0.00, 66.00,
},{
-108.00, 0.00, 66.00, -108.00, 12.00, 66.00, -120.00, 12.00, 66.00, -120.00, 0.00, 66.00,
-108.00, 0.00, 57.00, -108.00, 12.00, 57.00, -120.00, 12.00, 48.00, -120.00, 0.00, 48.00,
-100.00, 0.00, 39.00, -100.00, 12.00, 39.00, -106.00, 12.00, 31.50, -106.00, 0.00, 31.50,
-80.00, 0.00, 30.00, -80.00, 12.00, 30.00, -76.00, 12.00, 18.00, -76.00, 0.00, 18.00,
},{ // 15
-120.00, 0.00, 66.00, -120.00, -12.00, 66.00, -108.00, -12.00, 66.00, -108.00, 0.00, 66.00,
-120.00, 0.00, 48.00, -120.00, -12.00, 48.00, -108.00, -12.00, 57.00, -108.00, 0.00, 57.00,
-106.00, 0.00, 31.50, -106.00, -12.00, 31.50, -100.00, -12.00, 39.00, -100.00, 0.00, 39.00,
-76.00, 0.00, 18.00, -76.00, -12.00, 18.00, -80.00, -12.00, 30.00, -80.00, 0.00, 30.00,
},{
68.00, 0.00, 51.00, 68.00, 26.40, 51.00, 68.00, 26.40, 18.00, 68.00, 0.00, 18.00,
104.00, 0.00, 51.00, 104.00, 26.40, 51.00, 124.00, 26.40, 27.00, 124.00, 0.00, 27.00,
92.00, 0.00, 78.00, 92.00, 10.00, 78.00, 96.00, 10.00, 75.00, 96.00, 0.00, 75.00,
108.00, 0.00, 90.00, 108.00, 10.00, 90.00, 132.00, 10.00, 90.00, 132.00, 0.00, 90.00,
},{
68.00, 0.00, 18.00, 68.00, -26.40, 18.00, 68.00, -26.40, 51.00, 68.00, 0.00, 51.00,
124.00, 0.00, 27.00, 124.00, -26.40, 27.00, 104.00, -26.40, 51.00, 104.00, 0.00, 51.00,
96.00, 0.00, 75.00, 96.00, -10.00, 75.00, 92.00, -10.00, 78.00, 92.00, 0.00, 78.00,
132.00, 0.00, 90.00, 132.00, -10.00, 90.00, 108.00, -10.00, 90.00, 108.00, 0.00, 90.00,
},{
108.00, 0.00, 90.00, 108.00, 10.00, 90.00, 132.00, 10.00, 90.00, 132.00, 0.00, 90.00,
112.00, 0.00, 93.00, 112.00, 10.00, 93.00, 141.00, 10.00, 93.75, 141.00, 0.00, 93.75,
116.00, 0.00, 93.00, 116.00, 6.00, 93.00, 138.00, 6.00, 94.50, 138.00, 0.00, 94.50,
112.00, 0.00, 90.00, 112.00, 6.00, 90.00, 128.00, 6.00, 90.00, 128.00, 0.00, 90.00,
},{
132.00, 0.00, 90.00, 132.00, -10.00, 90.00, 108.00, -10.00, 90.00, 108.00, 0.00, 90.00,
141.00, 0.00, 93.75, 141.00, -10.00, 93.75, 112.00, -10.00, 93.00, 112.00, 0.00, 93.00,
138.00, 0.00, 94.50, 138.00, -6.00, 94.50, 116.00, -6.00, 93.00, 116.00, 0.00, 93.00,
128.00, 0.00, 90.00, 128.00, -6.00, 90.00, 112.00, -6.00, 90.00, 112.00, 0.00, 90.00,
},{ // 20
50.00, 0.00, 90.00, 50.00, 28.00, 90.00, 28.00, 50.00, 90.00, 0.00, 50.00, 90.00,
52.00, 0.00, 90.00, 52.00, 29.12, 90.00, 29.12, 52.00, 90.00, 0.00, 52.00, 90.00,
54.00, 0.00, 90.00, 54.00, 30.24, 90.00, 30.24, 54.00, 90.00, 0.00, 54.00, 90.00,
56.00, 0.00, 90.00, 56.00, 31.36, 90.00, 31.36, 56.00, 90.00, 0.00, 56.00, 90.00,
},{
0.00, 50.00, 90.00, -28.00, 50.00, 90.00, -50.00, 28.00, 90.00, -50.00, 0.00, 90.00,
0.00, 52.00, 90.00, -29.12, 52.00, 90.00, -52.00, 29.12, 90.00, -52.00, 0.00, 90.00,
0.00, 54.00, 90.00, -30.24, 54.00, 90.00, -54.00, 30.24, 90.00, -54.00, 0.00, 90.00,
0.00, 56.00, 90.00, -31.36, 56.00, 90.00, -56.00, 31.36, 90.00, -56.00, 0.00, 90.00,
},{
-50.00, 0.00, 90.00, -50.00, -28.00, 90.00, -28.00, -50.00, 90.00, 0.00, -50.00, 90.00,
-52.00, 0.00, 90.00, -52.00, -29.12, 90.00, -29.12, -52.00, 90.00, 0.00, -52.00, 90.00,
-54.00, 0.00, 90.00, -54.00, -30.24, 90.00, -30.24, -54.00, 90.00, 0.00, -54.00, 90.00,
-56.00, 0.00, 90.00, -56.00, -31.36, 90.00, -31.36, -56.00, 90.00, 0.00, -56.00, 90.00,
},{
0.00, -50.00, 90.00, 28.00, -50.00, 90.00, 50.00, -28.00, 90.00, 50.00, 0.00, 90.00,
0.00, -52.00, 90.00, 29.12, -52.00, 90.00, 52.00, -29.12, 90.00, 52.00, 0.00, 90.00,
0.00, -54.00, 90.00, 30.24, -54.00, 90.00, 54.00, -30.24, 90.00, 54.00, 0.00, 90.00,
0.00, -56.00, 90.00, 31.36, -56.00, 90.00, 56.00, -31.36, 90.00, 56.00, 0.00, 90.00,
},{
8.00, 0.00, 102.00, 8.00, 4.48, 102.00, 4.48, 8.00, 102.00, 0.00, 8.00, 102.00,
16.00, 0.00, 96.00, 16.00, 8.96, 96.00, 8.96, 16.00, 96.00, 0.00, 16.00, 96.00,
52.00, 0.00, 96.00, 52.00, 29.12, 96.00, 29.12, 52.00, 96.00, 0.00, 52.00, 96.00,
52.00, 0.00, 90.00, 52.00, 29.12, 90.00, 29.12, 52.00, 90.00, 0.00, 52.00, 90.00,
},{ // 25
0.00, 8.00, 102.00, -4.48, 8.00, 102.00, -8.00, 4.48, 102.00, -8.00, 0.00, 102.00,
0.00, 16.00, 96.00, -8.96, 16.00, 96.00, -16.00, 8.96, 96.00, -16.00, 0.00, 96.00,
0.00, 52.00, 96.00, -29.12, 52.00, 96.00, -52.00, 29.12, 96.00, -52.00, 0.00, 96.00,
0.00, 52.00, 90.00, -29.12, 52.00, 90.00, -52.00, 29.12, 90.00, -52.00, 0.00, 90.00,
},{
-8.00, 0.00, 102.00, -8.00, -4.48, 102.00, -4.48, -8.00, 102.00, 0.00, -8.00, 102.00,
-16.00, 0.00, 96.00, -16.00, -8.96, 96.00, -8.96, -16.00, 96.00, 0.00, -16.00, 96.00,
-52.00, 0.00, 96.00, -52.00, -29.12, 96.00, -29.12, -52.00, 96.00, 0.00, -52.00, 96.00,
-52.00, 0.00, 90.00, -52.00, -29.12, 90.00, -29.12, -52.00, 90.00, 0.00, -52.00, 90.00,
},{
0.00, -8.00, 102.00, 4.48, -8.00, 102.00, 8.00, -4.48, 102.00, 8.00, 0.00, 102.00,
0.00, -16.00, 96.00, 8.96, -16.00, 96.00, 16.00, -8.96, 96.00, 16.00, 0.00, 96.00,
0.00, -52.00, 96.00, 29.12, -52.00, 96.00, 52.00, -29.12, 96.00, 52.00, 0.00, 96.00,
0.00, -52.00, 90.00, 29.12, -52.00, 90.00, 52.00, -29.12, 90.00, 52.00, 0.00, 90.00,
},{
0.00, 0.00, 120.00, 0.00, 0.00, 120.00, 0.00, 0.00, 120.00, 0.00, 0.00, 120.00,
32.00, 0.00, 120.00, 32.00, 18.00, 120.00, 18.00, 32.00, 120.00, 0.00, 32.00, 120.00,
0.00, 0.00, 108.00, 0.00, 0.00, 108.00, 0.00, 0.00, 108.00, 0.00, 0.00, 108.00,
8.00, 0.00, 102.00, 8.00, 4.48, 102.00, 4.48, 8.00, 102.00, 0.00, 8.00, 102.00,
},{
0.00, 0.00, 120.00, 0.00, 0.00, 120.00, 0.00, 0.00, 120.00, 0.00, 0.00, 120.00,
0.00, 32.00, 120.00, -18.00, 32.00, 120.00, -32.00, 18.00, 120.00, -32.00, 0.00, 120.00,
0.00, 0.00, 108.00, 0.00, 0.00, 108.00, 0.00, 0.00, 108.00, 0.00, 0.00, 108.00,
0.00, 8.00, 102.00, -4.48, 8.00, 102.00, -8.00, 4.48, 102.00, -8.00, 0.00, 102.00,
},{ // 30
0.00, 0.00, 120.00, 0.00, 0.00, 120.00, 0.00, 0.00, 120.00, 0.00, 0.00, 120.00,
-32.00, 0.00, 120.00, -32.00, -18.00, 120.00, -18.00, -32.00, 120.00, 0.00, -32.00, 120.00,
0.00, 0.00, 108.00, 0.00, 0.00, 108.00, 0.00, 0.00, 108.00, 0.00, 0.00, 108.00,
-8.00, 0.00, 102.00, -8.00, -4.48, 102.00, -4.48, -8.00, 102.00, 0.00, -8.00, 102.00,
},{
0.00, 0.00, 120.00, 0.00, 0.00, 120.00, 0.00, 0.00, 120.00, 0.00, 0.00, 120.00,
0.00, -32.00, 120.00, 18.00, -32.00, 120.00, 32.00, -18.00, 120.00, 32.00, 0.00, 120.00,
0.00, 0.00, 108.00, 0.00, 0.00, 108.00, 0.00, 0.00, 108.00, 0.00, 0.00, 108.00,
0.00, -8.00, 102.00, 4.48, -8.00, 102.00, 8.00, -4.48, 102.00, 8.00, 0.00, 102.00,
}
};
}