Created
December 19, 2018 13:04
-
-
Save wonderburg7/9fe634b454747a424144445033147181 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Space Junk | |
* by Ira Greenberg (zoom suggestion by Danny Greenberg). | |
* | |
* Rotating cubes in space using a custom Cube class. | |
* Color controlled by light sources. Move the mouse left | |
* and right to zoom. | |
*/ | |
// Used for oveall rotation | |
float angle; | |
float xmag, ymag = 0; | |
float newXmag, newYmag = 0; | |
// Cube count-lower/raise to test performance | |
int limit = 300; | |
// Array for all cubes | |
Cube[] cubes = new Cube[limit]; | |
void setup() { | |
size(640, 500, P3D); | |
background(0); | |
noStroke(); | |
// Instantiate cubes, passing in random vals for size and postion | |
for (int i = 0; i < cubes.length; i++){ | |
cubes[i] = new Cube(int(random(-10, 10)), int(random(-10, 10)), | |
int(random(-10, 10)), int(random(-140, 140)), | |
int(random(-140, 140)), int(random(-140, 140))); | |
} | |
} | |
void draw(){ | |
background(0); | |
noFill(); | |
stroke(255); | |
pushMatrix(); | |
translate(width/2, height/2, -30); | |
newXmag = ((mouseX/float(width))/2) * TWO_PI; | |
newYmag = ((mouseY/float(height))/2) * TWO_PI; | |
float diff = xmag-newXmag; | |
if (abs(diff) > 0.01) { | |
xmag -= diff/4.0; | |
} | |
diff = ymag-newYmag; | |
if (abs(diff) > 0.01) { | |
ymag -= diff/4.0; | |
} | |
rotateX(-ymag); | |
rotateY(-xmag); | |
// Set up some different colored lights | |
pointLight(51, 102, 255, 65, 60, 100); | |
pointLight(200, 40, 60, -65, -60, -150); | |
// Raise overall light in scene | |
ambientLight(70, 70, 10); | |
// Center geometry in display windwow. | |
// you can changlee 3rd argument ('0') | |
// to move block group closer(+) / further(-) | |
// translate(width/2, height/2, -200 + mouseX * 0.65); | |
// Rotate around y and x axes | |
rotateY(radians(angle)); | |
rotateX(radians(angle)); | |
// Draw cubes | |
for (int i = 0; i < cubes.length; i++){ | |
cubes[i].drawCube(); | |
} | |
popMatrix(); | |
// Used in rotate function calls above | |
angle += 0.2; | |
} | |
class Cube { | |
// Properties | |
int w, h, d; | |
int shiftX, shiftY, shiftZ; | |
// Constructor | |
Cube(int w, int h, int d, int shiftX, int shiftY, int shiftZ){ | |
this.w = w; | |
this.h = h; | |
this.d = d; | |
this.shiftX = shiftX; | |
this.shiftY = shiftY; | |
this.shiftZ = shiftZ; | |
} | |
// Main cube drawing method, which looks | |
// more confusing than it really is. It's | |
// just a bunch of rectangles drawn for | |
// each cube face | |
void drawCube(){ | |
beginShape(QUADS); | |
// Front face | |
vertex(-w/2 + shiftX, -h/2 + shiftY, -d/2 + shiftZ); | |
vertex(w + shiftX, -h/2 + shiftY, -d/2 + shiftZ); | |
vertex(w + shiftX, h + shiftY, -d/2 + shiftZ); | |
vertex(-w/2 + shiftX, h + shiftY, -d/2 + shiftZ); | |
// Back face | |
vertex(-w/2 + shiftX, -h/2 + shiftY, d + shiftZ); | |
vertex(w + shiftX, -h/2 + shiftY, d + shiftZ); | |
vertex(w + shiftX, h + shiftY, d + shiftZ); | |
vertex(-w/2 + shiftX, h + shiftY, d + shiftZ); | |
// Left face | |
vertex(-w/2 + shiftX, -h/2 + shiftY, -d/2 + shiftZ); | |
vertex(-w/2 + shiftX, -h/2 + shiftY, d + shiftZ); | |
vertex(-w/2 + shiftX, h + shiftY, d + shiftZ); | |
vertex(-w/2 + shiftX, h + shiftY, -d/2 + shiftZ); | |
// Right face | |
vertex(w + shiftX, -h/2 + shiftY, -d/2 + shiftZ); | |
vertex(w + shiftX, -h/2 + shiftY, d + shiftZ); | |
vertex(w + shiftX, h + shiftY, d + shiftZ); | |
vertex(w + shiftX, h + shiftY, -d/2 + shiftZ); | |
// Top face | |
vertex(-w/2 + shiftX, -h/2 + shiftY, -d/2 + shiftZ); | |
vertex(w + shiftX, -h/2 + shiftY, -d/2 + shiftZ); | |
vertex(w + shiftX, -h/2 + shiftY, d + shiftZ); | |
vertex(-w/2 + shiftX, -h/2 + shiftY, d + shiftZ); | |
// Bottom face | |
vertex(-w/2 + shiftX, h + shiftY, -d/2 + shiftZ); | |
vertex(w + shiftX, h + shiftY, -d/2 + shiftZ); | |
vertex(w + shiftX, h + shiftY, d + shiftZ); | |
vertex(-w/2 + shiftX, h + shiftY, d + shiftZ); | |
endShape(); | |
// Add some rotation to each box for pizazz. | |
rotateY(radians(1)); | |
rotateX(radians(1)); | |
rotateZ(radians(1)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment