//
import render.*; import java.awt.*; public class Teapot extends RenderApplet { Geometry teapot; Material opaque, transparent; public void initialize() { setBgColor(.5,.5,1); setFL(15); setFOV(.65); Material baseColor = new Material(); baseColor.setColor(0,0,0, .8,0,0,10).setAmbient(.5,0,0); push(); translate(0,.4,0); rotateX(.2); transform(world); pop(); Geometry base = world.add().globe(50,20).superquadric(4,0).setMaterial(baseColor); push(); translate(.1,-1.5,0); rotateX(Math.PI/2); scale(4,4,.5); transform(base); pop(); opaque = new Material(); opaque.setColor(.6,.4,.2, .8,.8,.8,5).setAmbient(.2,0,0).setDoubleSided(true); //opaque.setColor(.6,.4,.2, .8,.8,.8,5).setAmbient(.2,0,0); transparent = new Material(); transparent.setColor(.3,.3,.3, 2,2,2,20).setAmbient(.4,0,0).setTransparency(.4); teapot = world.add(); push(); translate(0,-1,0); rotateX(-Math.PI/2); scale(.03,.03,.03); transform(teapot); pop(); Geometry s; for (int i = 0 ; i < teapot_data.length ; i++) { /* if (i == 2) { s = teapot.add().setMaterial(transparent); Geometry p = new Geometry().patch(4,4, Geometry.Bezier, teapot_data[i]); double data[] = new double[4*4*3]; for (int I = 0 ; I < 4 ; I++) for (int J = 0 ; J < 4 ; J++) int m = 7, n = 7; double v[][] = p.vertices; for (int k = 0 ; k < 3 ; k++) { data[ k] = v[(I+1)*m + (J+1)][k]; data[3+k] = v[(I+2)*m + (J+1)][k]; } s.add().patch(4,4, Geometry.Hermite, data); } } else */ { //int m = 16, n = i < 12 ? 32 : 16; int m = 8, n = i < 12 ? 16 : 8; s = teapot.add().patch(m,n, Geometry.Bezier, teapot_data[i]).setMaterial(opaque); } if (i >= 24) s.setMaterial(transparent); } addLight( 1, 0,-1, .25,.25,.5); addLight(-1, 0,-1, .25,.25,.5); addLight( 2,-.5,0, .3,.4,.3); addLight(-1, 0, 0, .3,.4,.3); addLight( 0,.5, 1, .3,.4,.3); addLight( 0,-1, 0, .2, 0, 0); } boolean isMorphing = false; double time = 0; public void animate(double time) { if (this.time == 0) this.time = time; if (isMorphing) { teapot.noiseOrigin[0] += 100; teapot.displaceByImprovedNoise(.02, 3. * (time - this.time)); } this.time = time; } boolean isTransparent[] = {false,false,false,false,false,false,true,true}; int noiseLevel = 0; public boolean keyUp(Event e, int key) { if (key >= '1' && key <= '8') { int k = key - '1'; for (int i = 4*k ; i < 4*k+1 ; i++) teapot.child[i].setMaterial(isTransparent[k] ? opaque : transparent); isTransparent[k] = !isTransparent[k]; damage(); return true; } switch (key) { case 'm': isMorphing = ! isMorphing; damage(); return true; case 'n': switch (noiseLevel) { case 0: teapot.displaceByImprovedNoise(.015, 20); break; case 1: teapot.displaceByImprovedNoise(.03 , 10); break; case 2: teapot.displaceByImprovedNoise(.06 , 5); break; } noiseLevel++; damage(); return true; case 'o': renderer.seeMesh = ! renderer.seeMesh; damage(); return true; } return super.keyUp(e, key); } 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, } }; } //