//
import render.*; public class Snitch extends Actor { public Snitch() { m = new Matrix(); m.identity(); for (int i = 0 ; i < stack.length ; i++) stack[i] = new Matrix(); Material gold = new Material(); gold.setColor(.4,.3,.12, .8*1.5,.6*1.5,.24*1.5,12, .3*1.5,.225*1.5,.09*1.5); add().ball(10).setMaterial(gold); Material white = new Material(); white.setColor(.5,.5,.5, 0,0,0,1, .5,.5,.5).setTransparency(.1); add().cylinder(10).setMaterial(white); add().cylinder(10).setMaterial(white); add().ball(10).setMaterial(white); add().cylinder(10).setMaterial(white); add().cylinder(10).setMaterial(white); add().ball(10).setMaterial(white); Material aura1 = new Material(); aura1.setColor(0,0,0, 0,0,0,1, 4,2,1.2).setTransparency(.75); add().ball(10).setMaterial(aura1); Material aura2 = new Material(); aura2.setColor(0,0,0, 0,0,0,1, 4,2,1.2).setTransparency(.9); add().ball(10).setMaterial(aura2); add().ball(10).setMaterial(aura2); } double y=0, phase=0, rate=1, bounce=1; public void setRate(double r) { rate = r; } public void animate(double time) { super.animate(time); phase += rate * elapsed; y = 1 - (.3 + .5/rate) * Math.sin(phase); push(); translate(x, y, z); rotateY(theta); scale(.2,.2,.2); transform(this); pop(); double flap1 = Math.cos(phase); double flap2 = Math.sin(phase) - flap1; double r = .6, w = .5, t = .2; push(); translate(0,0,-r); rotateX(.5*flap1); translate(0,0,-r); push(); scale(w,t,r); transform(child[1]); pop(); translate(0,0,-r); rotateX(.5*flap2); translate(0,0,-r); push(); scale(w,t,r); transform(child[2]); pop(); translate(0,0,-r); push(); rotateX(Math.PI/2); scale(w,w,t); transform(child[3]); pop(); pop(); push(); translate(0,0,r); rotateX(-.5*flap1); translate(0,0,r); push(); scale(w,t,r); transform(child[4]); pop(); translate(0,0,r); rotateX(-.5*flap2); translate(0,0,r); push(); scale(w,t,r); transform(child[5]); pop(); translate(0,0,r); push(); rotateX(Math.PI/2); scale(w,w,t); transform(child[6]); pop(); pop(); push(); scale(1.14,1.14,1.14); transform(child[7]); scale(1.14,1.14,1.14); transform(child[8]); scale(1.14,1.14,1.14); transform(child[9]); pop(); } void push() { stack[top++].copy(m); } void pop() { m.copy(stack[--top]); } void translate(double x,double y,double z) { m.translate(x,y,z); } void scale(double x,double y,double z) { m.scale(x,y,z); } void rotateX(double t) { m.rotateX(t); } void rotateY(double t) { m.rotateY(t); } void rotateZ(double t) { m.rotateZ(t); } void transform(Geometry g) { g.matrix.copy(m); } int top = 0; Matrix m, stack[] = new Matrix[20]; }