//
import render.*;
public class rosie1 extends RenderApplet
{
Geometry wheel, hub, plate1, plate2, bearing;
Geometry frame[] = new Geometry[3];
Material frameColor, motorColor, plateColor, wheelColor, magnetColor;
public void initialize() {
// CREATE ALL THE SURFACE TYPES
frameColor = new Material();
frameColor.setColor(.2,.2,.2, .8,.8,.8,20).setAmbient(.1,.1,.1);
frameColor.noiseA = 1;
frameColor.noiseF = 2;
plateColor = new Material();
plateColor.setColor(.2,.15,.05, 1,.75,.25,10).setAmbient(.2,.15,.05);
plateColor.noiseA = 1;
plateColor.noiseF = 2;
motorColor = new Material();
motorColor.setColor(.18,.1,.05, .64,.4,.2,7).setColor(.17,.1,.05);
wheelColor = new Material();
wheelColor.setColor(.2,.1,.1, .6,.3,.3,10).setAmbient(.2,.1,.1);
magnetColor = new Material();
magnetColor.setColor(.3,0,0, .5,0,0,10);
// CREATE THE TOP AND BOTTOM WOBBLING PLATES
plate1 = makePlate(world.add().setMaterial(plateColor));
plate2 = makePlate(world.add().setMaterial(plateColor));
// CREATE THE THREE PARTS OF THE SUPPORT FRAME
for (int i = 0 ; i < 3 ; i++) {
frame[i] = makeFrame(world.add().setMaterial(frameColor));
push();
rotateZ(i*2*Math.PI/3);
transform(frame[i]);
pop();
}
// CREATE THE BALL BEARING BETWEEN THE TOP AND BOTTOM PLATES
bearing = world.add().ball(10).setMaterial(frameColor);
push();
scale(.15,.15,.15);
transform(bearing);
pop();
// CREATE THE BIG WHEEL
wheel = world.add().ball(10).setMaterial(wheelColor);
push();
translate(0,0,-4.7);
rotateX(Math.PI/2);
scale(3,3,.2);
transform(wheel);
pop();
// CREATE THE HUB SUPPORT STRUTS
hub = world.add().setMaterial(frameColor);
hub.add().cylinder(20);
push();
translate(-.17,.6,-3);
rotateY(-.13);
rotateZ(Math.PI/6);
scale(.05,.3,1.6);
transform(hub.child[0]);
pop();
hub.add().cylinder(20);
push();
translate(-.17,-.6,-3);
rotateY(-.13);
rotateZ(-Math.PI/6);
scale(.05,.3,1.6);
transform(hub.child[1]);
pop();
// CREATE THE HUB SPHERE
hub.add().globe(30,20, 0,1,0,.4);
push();
translate(0,0,-4.7);
rotateX(Math.PI/2);
scale(.9,.9,.9);
transform(hub.child[2]);
pop();
hub.add().globe(30,20, 0,1,.6,1);
push();
translate(0,0,-4.7);
rotateX(Math.PI/2);
scale(.9,.9,.9);
transform(hub.child[3]);
pop();
// CREATE THE HUB AXLE
hub.add().cylinder(10);
push();
translate(0,0,-4.7);
rotateX(Math.PI/2);
scale(.2,.2,.6);
transform(hub.child[4]);
pop();
// SET THE CAMERA FIELD OF VIEW
setFOV(1.1);
renderer.isHeadsUp = true;
// LIGHTS
addLight( 1, 1, 1, 1,1,1);
addLight(-1, 1, 1, 1,1,1);
addLight( 1,-1, 1, 1,1,1);
addLight(-1,-1, 1, 1,1,1);
addLight( 1, 1,-1, 1,1,1);
addLight(-1, 1,-1, 1,1,1);
addLight( 1,-1,-1, 1,1,1);
addLight(-1,-1,-1, 1,1,1);
// WHITE BACKGROUND TO MATCH THE WEB PAGE
setBgColor(1,1,1);
}
public void animate(double time) {
double rate = 3;
double tilt = .025;
double s = tilt * Math.sin(rate*time);
// ROTATE THE TWO FLYWHEELS
push();
rotateZ(1.5 * time);
transform(plate1.child[0]);
transform(plate2.child[0]);
pop();
// MAKE THE ENTIRE VEHICLE VIBRATE SLIGHTLY
push();
rotateX(-Math.PI/2);
translate(0,0,3);
translate(0,0,-8);
rotateX(.002*Math.sin(20*time));
rotateY(.002*Math.cos(20*time));
translate(0,0,8);
transform(world);
pop();
// MAKE THE TWO PLATES WOBBLE
push();
rotateX(Math.PI);
translate(0,0,.5);
rotateZ(-rate*time);
rotateY(s);
rotateZ(rate*time);
transform(plate1);
pop();
push();
translate(0,0,.5);
rotateZ(rate*time);
rotateY(s);
rotateZ(-rate*time);
transform(plate2);
pop();
// BEND THE FRAME LINKAGE PARTS TO FOLLOW THE TWO WOBBLING PLATES
for (int i = 0 ; i < 3 ; i++) {
double t = Math.PI/4 - tilt*5/3 * Math.sin(2*rate*time-i*2*Math.PI/3);
animateLinkage(frame[i], t, 1, 0); // LINKAGE TO TOP PLATE
animateLinkage(frame[i], t,-1, 1); // LINKAGE TO BOTTOM PLATE
}
}
// BEND THE FRAME LINKAGE PARTS TO FOLLOW A WOBBLING PLATE
void animateLinkage(Geometry frame, double t, double s, int i) {
push();
translate(1.6,s*.07,0);
rotateY(s*t);
translate(-.2,0,0);
push();
scale(1,.05,1);
rotateX(Math.PI/2);
transform(frame.child[i]);
pop();
translate(-.2,-s*.14,0);
rotateY(-2*s*t);
push();
scale(1,.05,1);
rotateX(Math.PI/2);
transform(frame.child[i+2]);
pop();
translate(.4,0,0);
push();
scale(.17,.17,.17);
transform(frame.child[i+4]);
pop();
pop();
}
// CREATE THE PARTS FOR ONE WOBBLING PLATE
Geometry makePlate(Geometry s) {
// FLYWHEEL
Geometry g;
g = s.add().setMaterial(motorColor);
for (int i = 0 ; i < 3 ; i++) {
g.add().cylinder(18);
push();
translate(0,0,.55);
rotateZ(i*Math.PI/3);
scale(2.05,.14,.14);
rotateY(Math.PI/2);
transform(g.child[i]);
pop();
}
g.add().torus(18,24,.1);
push();
translate(0,0,.55);
scale(2.05,2.05,1.4);
rotateZ(Math.PI/6);
//rotateY(Math.PI/2);
transform(g.child[3]);
pop();
// AXLE FROM MOTOR TO FLYWHEEL
g = s.add().cylinder(10).setMaterial(frameColor);
push();
translate(0,0,.3);
scale(.07,.07,.4);
transform(g);
pop();
// THE PLATE
g = s.add().cylinder(30);
push();
translate(0,0,.22);
scale(1.8,1.8,.03);
transform(g);
pop();
// CONNECTION TO BALL BEARING
g = s.add().cylinder(10);
push();
translate(0,0,-.11);
scale(.22,.22,.32);
transform(g);
pop();
// MOTOR
g = s.add().cylinder(20).setMaterial(motorColor);
push();
translate(0,0,-.1);
scale(.5,.5,.3);
transform(g);
pop();
for (int i = 0 ; i < 3 ; i++) {
// BEARING CONNECTION TO FRAME LINKAGE
g = s.add().globe(20,10,0,1,.4,1);
push();
rotateZ(i*2*Math.PI/3);
translate(1.6,-.07,.065);
scale(.2,.2,.2);
rotateY(Math.PI/4);
transform(g);
pop();
// ELECTROMAGNET WINDINGS
g = s.add().cylinder(10).setMaterial(magnetColor);
push();
rotateZ(Math.PI/3 + i*2*Math.PI/3);
translate(1,0,-.08);
scale(.3,.3,.27);
transform(g);
pop();
// ELECTROMAGNET CORE
g = s.add().cylinder(10).setMaterial(frameColor);
push();
rotateZ(Math.PI/3 + i*2*Math.PI/3);
translate(1,0,-.13);
scale(.2,.2,.28);
transform(g);
pop();
}
return s;
}
// MAKE THE SUPPORT FRAME
Geometry makeFrame(Geometry s) {
Geometry g;
// THE BENDABLE LINKAGES TO THE WOBBLING PLATES
g = makeLink(s.add(),.2,.1);
g = makeLink(s.add(),.2,.1);
g = makeLink(s.add(),.4,.1);
g = makeLink(s.add(),.4,.1);
g = s.add().ball(10);
g = s.add().ball(10);
// THE STATIC SUPPORT FRAME
g = makeLink(s.add(),.4,.1);
push();
translate(2,-.2,0);
scale(1,.05,1);
rotateX(Math.PI/2);
transform(g);
pop();
g = makeLink(s.add(),.4,.1);
push();
translate(2,.2,0);
scale(1,.05,1);
rotateX(Math.PI/2);
transform(g);
pop();
g = s.add().cube();
push();
translate(2.15,0,0);
scale(.36,.26,.1);
transform(g);
pop();
g = s.add().cube();
push();
translate(2.4,0,-.6);
scale(.1,.15,.7);
transform(g);
pop();
g = s.add().cube();
push();
translate(1.25,0,-1.4);
scale(1.25,.15,.1);
transform(g);
pop();
return s;
}
// CREATE ONE LINK SHAPE WITH ROUNDED ENDS
Geometry makeLink(Geometry s, double d, double r) {
Geometry g;
g = s.add().cube();
push();
scale(d,r,1);
transform(g);
pop();
g = s.add().cylinder(10);
push();
translate(d,0,0);
scale(r,r,1);
transform(g);
pop();
g = s.add().cylinder(10);
push();
translate(-d,0,0);
scale(r,r,1);
transform(g);
pop();
return s;
}
public void toggleOutline() {
renderer.outline(-renderer.getOutline());
}
}