xxxxxxxxxx
//By: Jem Brown
VehicleAndScene vehicleAndScene;
void setup () {
size(1200, 450, P3D);
colorMode(HSB, 360, 100, 100, 100);
imageMode(CENTER);
rectMode(CENTER);
background(0);
vehicleAndScene = new VehicleAndScene();
}
void draw () {
background(0);
vehicleAndScene.run();
}
class Space {
PVector location;
PVector position;
PVector velocity;
float radius;
Space (float _radius, float vx) {
location = new PVector(random(-width, width), random(-height, height), 0);
position = new PVector(0, 0, 0);
velocity = new PVector(vx, 0, 0);
radius = _radius;
}
void run () {
pushMatrix();
movement();
boundaries();
display();
popMatrix();
}
void movement () {
position.lerp(velocity, 0.05);
location.add(position);
}
void boundaries () {
if (location.x < -width) {
location.x = width;
location.y = random(-height, height);
}
if (location.x > width) {
location.x = -width;
location.y = random(-height, height);
}
}
void display () {
noStroke();
fill(360);
ellipse(location.x, location.y, radius*10, radius);
}
}
class Vehicle {
PVector locationSIDE;
PVector locationBACK;
Vehicle () {
locationSIDE = new PVector(0, 0, 0);
locationBACK = new PVector(0, 0, 0);
}
void displaySIDE(float x, float y, float z) {
pushMatrix();
translate(x, y, z);
translate(-190, 0, 0);
rotateY(-HALF_PI);
stroke(360);
pushMatrix();
//scale(1.5, 1.5);
//FIN
fill(220, 80, 80);
beginShape();
vertex(-10, -100, -170);
vertex(10, -100, -170);
vertex(0, -115, -150);
endShape(CLOSE);
beginShape();
vertex(-10, -100, -290);
vertex(10, -100, -290);
vertex(0, -115, -270);
endShape(CLOSE);
beginShape();
vertex(-10, -100, -170);
vertex(-10, -100, -290);
vertex(0, -115, -270);
vertex(0, -115, -150);
endShape(CLOSE);
beginShape();
vertex(10, -100, -170);
vertex(10, -100, -290);
vertex(0, -115, -270);
vertex(0, -115, -150);
endShape(CLOSE);
//---------------------
//TOP and BOTTOM
beginShape();
vertex(-100, 0, 0);
vertex(-90, -40, 20);
vertex(90, -40, 20);
vertex(100, 0, 0);
endShape(CLOSE);
beginShape();
vertex(-90, -40, 20);
vertex(-80, -35, -10);
vertex(80, -35, -10);
vertex(90, -40, 20);
endShape(CLOSE);
beginShape();
vertex(-80, -35, -10);
vertex(-65, -45, -80);
vertex(65, -45, -80);
vertex(80, -35, -10);
endShape(CLOSE);
beginShape();
vertex(-65, -45, -80);
vertex(-65, -50, -85);
vertex(65, -50, -85);
vertex(65, -45, -80);
endShape(CLOSE);
beginShape();
vertex(-65, -50, -85);
vertex(-65, -50, -120);
vertex(65, -50, -120);
vertex(65, -50, -85);
endShape(CLOSE);
beginShape();
vertex(-65, -50, -120); //back window
vertex(-50, -90, -140);
vertex(0, -90, -140);
vertex(0, -85, -145);
vertex(-40, -85, -145);
vertex(-50, -60, -125);
vertex(50, -60, -125);
vertex(40, -85, -145);
vertex(0, -85, -145);
vertex(0, -90, -140);
vertex(50, -90, -140);
vertex(65, -50, -120);
endShape(CLOSE);
beginShape();
vertex(-50, -90, -140);
vertex(-37, -94, -290);
vertex(-10, -100, -290);
vertex(-10, -100, -170);
vertex(10, -100, -170);
vertex(10, -100, -290);
vertex(37, -94, -290);
vertex(50, -90, -140);
endShape(CLOSE);
beginShape();
vertex(-10, -100, -290); //fix
vertex(-37, -94, -290);
vertex(-35, -94, -310);
vertex(35, -94, -310);
vertex(37, -94, -290);
vertex(10, -100, -290);
endShape(CLOSE);
beginShape();
vertex(-35, -94, -310);
vertex(-40, -90, -310);
vertex(40, -90, -310);
vertex(35, -94, -310);
endShape(CLOSE);
beginShape();
vertex(-40, -90, -310); //front window
vertex(-50, -45, -350);
vertex(0, -45, -350);
vertex(0, -50, -345);
vertex(-45, -50, -345);
vertex(-35, -85, -315);
vertex(35, -85, -315);
vertex(45, -50, -345);
vertex(0, -50, -345);
vertex(0, -45, -350);
vertex(50, -45, -350);
vertex(40, -90, -310);
endShape(CLOSE);
beginShape();
vertex(-50, -45, -350);
vertex(-40, -40, -385);
vertex(40, -40, -385);
vertex(50, -45, -350);
endShape(CLOSE);
beginShape();
vertex(-40, -40, -385);
vertex(-40, -40, -395);
vertex(40, -40, -395);
vertex(40, -40, -385);
endShape(CLOSE);
beginShape();
vertex(-40, -40, -395);
vertex(-40, -35, -400);
vertex(40, -35, -400);
vertex(40, -40, -395);
endShape(CLOSE);
beginShape();
vertex(-40, -35, -400);
vertex(-30, -15, -550);
vertex(30, -15, -550);
vertex(40, -35, -400);
endShape(CLOSE);
beginShape();
vertex(-30, -15, -550);
vertex(-30, -0, -570);
vertex(30, -0, -570);
vertex(30, -15, -550);
endShape(CLOSE);
beginShape(); //bottom
vertex(-30, 0, -570);
vertex(-100, 0, 0);
vertex(100, 0, 0);
vertex(30, 0, -570);
endShape(CLOSE);
//--------------------------
//RIGHT SIDE
fill(220, 80, 80);
beginShape();
vertex(100, 0, 0);
vertex(90, -40, 20);
vertex(80, -35, -10);
vertex(65, -45, -80);
vertex(65, -50, -85);
vertex(65, -50, -120);
vertex(60, -40, -200);
vertex(50, -40, -330);
//////
vertex(50, -45, -350);
vertex(40, -40, -385);
vertex(40, -40, -395);
vertex(40, -35, -400);
vertex(30, -15, -550);
vertex(30, 0, -570);
endShape(CLOSE);
beginShape();
vertex(55, -80, -200);
vertex(60, -40, -200);
vertex(65, -50, -120);
vertex(50, -90, -140);
endShape(CLOSE);
beginShape();
vertex(55, -80, -200);
vertex(50, -90, -140);
vertex(35, -94, -310);
vertex(40, -90, -310);
vertex(45, -80, -300);
endShape(CLOSE);
beginShape(TRIANGLE_STRIP);
vertex(50, -40, -330);
vertex(45, -80, -300);
vertex(40, -90, -310);
vertex(50, -40, -330);
vertex(50, -45, -350);
vertex(40, -90, -310);
endShape(CLOSE);
//LEFT SIDE
beginShape();
vertex(-100, 0, 0);
vertex(-90, -40, 20);
vertex(-80, -35, -10);
vertex(-65, -45, -80);
vertex(-65, -50, -85);
vertex(-65, -50, -120);
vertex(-60, -40, -200);
vertex(-50, -40, -330);
//////
vertex(-50, -45, -350);
vertex(-40, -40, -385);
vertex(-40, -40, -395);
vertex(-40, -35, -400);
vertex(-30, -15, -550);
vertex(-30, 0, -570);
endShape(CLOSE);
beginShape();
vertex(-55, -80, -200);
vertex(-60, -40, -200);
vertex(-65, -50, -120);
vertex(-50, -90, -140);
endShape(CLOSE);
beginShape();
vertex(-55, -80, -200);
vertex(-50, -90, -140);
vertex(-35, -94, -310);
vertex(-40, -90, -310);
vertex(-45, -80, -300);
endShape(CLOSE);
beginShape(TRIANGLE_STRIP);
vertex(-50, -40, -330);
vertex(-45, -80, -300);
vertex(-40, -90, -310);
vertex(-50, -40, -330);
vertex(-50, -45, -350);
vertex(-40, -90, -310);
endShape(CLOSE);
//-------------------------------
//FRONT WINDOW
fill(180, 50);
beginShape(); //front
vertex(-40, -90, -310);
vertex(-35, -40, -385);
vertex(35, -40, -385);
vertex(40, -90, -310);
endShape(CLOSE);
beginShape(); //left side
vertex(-40, -90, -310);
vertex(-35, -40, -385);
vertex(-45, -45, -350);
endShape(CLOSE);
beginShape(); //right side
vertex(40, -90, -310);
vertex(35, -40, -385);
vertex(45, -45, -350);
endShape(CLOSE);
//RIGHT WINDOW
fill(220, 40);
beginShape();
vertex(45, -80, -300); //window
vertex(55, -80, -200);
vertex(60, -40, -200);
vertex(50, -40, -330);
endShape(CLOSE);
/*beginShape();
vertex(50, -90, -140);
vertex(35, -94, -310);
vertex(40, -90, -310);
vertex(50, -80, -300); //window
vertex(55, -80, -200);
bezierVertex(60, -40, -200, 60, -40, -280, 50, -40, -330);
vertex(50, -80, -300);
vertex(40, -90, -310);
endShape(CLOSE);*/
//LEFT WINDOW
beginShape();
vertex(-45, -80, -300); //window
vertex(-55, -80, -200);
vertex(-60, -40, -200);
vertex(-50, -40, -330);
endShape();
/*beginShape();
vertex(-50, -90, -140);
vertex(-35, -94, -310);
vertex(-40, -90, -310);
vertex(-50, -80, -300); //window
vertex(-55, -80, -200);
bezierVertex(-60, -40, -200, -60, -40, -280, -50, -40, -330);
vertex(-50, -80, -300);
vertex(-40, -90, -310);
endShape(CLOSE);*/
//BACK WINDOW
fill(180, 50);
beginShape(); //front
vertex(-65, -40, -85);
vertex(-50, -90, -140);
vertex(50, -90, -140);
vertex(65, -40, -85);
endShape(CLOSE);
beginShape(); //right side
vertex(65, -50, -85);
vertex(50, -90, -140);
vertex(65, -50, -120);
endShape(CLOSE);
beginShape(); //left side
vertex(-65, -50, -85);
vertex(-50, -90, -140);
vertex(-65, -50, -120);
endShape(CLOSE);
//--------------------------------------
//BUMPER
//left
fill(180);
beginShape();
vertex(-110, 0, 40);
vertex(-120, -20, 40);
vertex(-80, -20, 40);
vertex(-80, 0, 40);
endShape(CLOSE);
beginShape();
vertex(-110, 0, 40);
vertex(-120, -20, 40);
vertex(-100, -10, -20);
vertex(-105, 0, -20);
endShape(CLOSE);
beginShape();
vertex(-105, 0, -20);
vertex(-100, -10, -20);
vertex(-80, -10, -20);
vertex(-80, 0, -20);
endShape(CLOSE);
beginShape();
vertex(-80, 0, -20);
vertex(-80, -10, -20);
vertex(-80, -20, 40);
vertex(-80, 0, 40);
endShape(CLOSE);
beginShape(); //top
vertex(-80, -20, 40);
vertex(-120, -20, 40);
vertex(-100, -10, -20);
vertex(-80, -10, -20);
endShape(CLOSE);
beginShape(); //bottom
vertex(-80, 0, 40);
vertex(-110, 0, 40);
vertex(-105, 0, -20);
vertex(-80, 0, -20);
endShape(CLOSE);
//right
beginShape();
vertex(110, 0, 40);
vertex(120, -20, 40);
vertex(80, -20, 40);
vertex(80, 0, 40);
endShape(CLOSE);
beginShape();
vertex(110, 0, 40);
vertex(120, -20, 40);
vertex(100, -10, -20);
vertex(105, 0, -20);
endShape(CLOSE);
beginShape();
vertex(105, 0, -20);
vertex(100, -10, -20);
vertex(80, -10, -20);
vertex(80, 0, -20);
endShape(CLOSE);
beginShape();
vertex(80, 0, -20);
vertex(80, -10, -20);
vertex(80, -20, 40);
vertex(80, 0, 40);
endShape(CLOSE);
beginShape(); //top
vertex(80, -20, 40);
vertex(120, -20, 40);
vertex(100, -10, -20);
vertex(80, -10, -20);
endShape(CLOSE);
beginShape(); //bottom
vertex(80, 0, 40);
vertex(110, 0, 40);
vertex(105, 0, -20);
vertex(80, 0, -20);
endShape(CLOSE);
//base
beginShape(); //top
vertex(-105, -10, 20);
vertex(-30, -5, -570);
vertex(30, -5, -570);
vertex(105, -10, 20);
endShape();
beginShape(); //bottom
vertex(-105, 5, 10);
vertex(-30, 5, -580);
vertex(30, 5, -580);
vertex(105, 5, 10);
endShape();
beginShape(); //back
vertex(-105, 5, 10);
vertex(-105, -10, 20);
vertex(105, -10, 20);
vertex(105, 5, 10);
endShape();
beginShape(); //front
vertex(-30, 5, -580);
vertex(-30, -5, -570);
vertex(30, -5, -570);
vertex(30, 5, -580);
endShape();
beginShape(); //right
vertex(105, 5, 10);
vertex(30, 5, -580);
vertex(30, -5, -570);
vertex(105, -10, 20);
endShape(CLOSE);
beginShape(); //left
vertex(-105, 5, 10);
vertex(-30, 5, -580);
vertex(-30, -5, -570);
vertex(-105, -10, 20);
endShape(CLOSE);
popMatrix();
//-------------------------------
//WHEELS (3D)
/*pushMatrix();
translate(100, 0, -60);
rotateX(HALF_PI);
rotateZ(HALF_PI);
cylinder(60, 60, 35, 12);
popMatrix();
pushMatrix();
translate(-100, 0, -60);
rotateX(HALF_PI);
rotateZ(-HALF_PI);
cylinder(60, 60, 35, 12);
popMatrix();
pushMatrix();
translate(12.5, 5, -470);
rotateX(HALF_PI);
rotateZ(HALF_PI);
cylinder(45, 45, 25, 12);
popMatrix();*/
popMatrix();
}
}
void cylinder(float bottom, float top, float h, int sides)
{
pushMatrix();
translate(0, h/2, 0);
float angle;
float[] x = new float[sides+1];
float[] z = new float[sides+1];
float[] x2 = new float[sides+1];
float[] z2 = new float[sides+1];
//get the x and z position on a circle for all the sides
for (int i=0; i < x.length; i++) {
angle = TWO_PI / (sides) * i;
x[i] = sin(angle) * bottom;
z[i] = cos(angle) * bottom;
}
for (int i=0; i < x.length; i++) {
angle = TWO_PI / (sides) * i;
x2[i] = sin(angle) * top;
z2[i] = cos(angle) * top;
}
//draw the bottom of the cylinder
beginShape(TRIANGLE_FAN);
vertex(0, -h/2, 0);
for (int i=0; i < x.length; i++) {
vertex(x[i], -h/2, z[i]);
}
endShape();
//draw the center of the cylinder
beginShape(QUAD_STRIP);
for (int i=0; i < x.length; i++) {
vertex(x[i], -h/2, z[i]);
vertex(x2[i], h/2, z2[i]);
}
endShape();
//draw the top of the cylinder
beginShape(TRIANGLE_FAN);
vertex(0, h/2, 0);
for (int i=0; i < x.length; i++) {
vertex(x2[i], h/2, z2[i]);
}
endShape();
popMatrix();
}
class VehicleAndScene {
Vehicle vehicle;
Space [] spaceBG = new Space [30];
Space [] spaceFG = new Space [10];
PVector mouse1, mouse2;
VehicleAndScene () {
vehicle = new Vehicle();
for (int n = 0; n < spaceBG.length; n++) {
spaceBG [n] = new Space(random(1, 3), random(-30, -20));
}
for (int n = 0; n < spaceFG.length; n++) {
spaceFG [n] = new Space(random(5, 8), random(-60, -50));
}
}
void run () {
runSPACE();
}
void runSPACE () {
mouse2 = new PVector(mouseX, mouseY, 0);
mouse2.x = map(mouse2.x, 0, width, -width/2, width/2);
mouse2.y = map(mouse2.y, 0, height, -height/1.5, height/1.5);
camera(0.0, 0.0, width/2, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
for (Space s1: spaceBG) {
s1.run();
}
vehicle.displaySIDE(mouse2.x, 0, mouse2.y);
for (Space s2: spaceFG) {
s2.run();
}
}
}